{
 "cells": [
  {
   "cell_type": "code",
   "execution_count": 1,
   "id": "66f4786c-379b-45a1-8623-5400dcb214ba",
   "metadata": {},
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "2024-06-20 09:43:50.968673: I tensorflow/core/util/port.cc:113] oneDNN custom operations are on. You may see slightly different numerical results due to floating-point round-off errors from different computation orders. To turn them off, set the environment variable `TF_ENABLE_ONEDNN_OPTS=0`.\n",
      "2024-06-20 09:43:50.992222: I tensorflow/core/platform/cpu_feature_guard.cc:210] This TensorFlow binary is optimized to use available CPU instructions in performance-critical operations.\n",
      "To enable the following instructions: AVX2 AVX_VNNI FMA, in other operations, rebuild TensorFlow with the appropriate compiler flags.\n",
      "2024-06-20 09:43:51.470624: W tensorflow/compiler/tf2tensorrt/utils/py_utils.cc:38] TF-TRT Warning: Could not find TensorRT\n"
     ]
    }
   ],
   "source": [
    "import os\n",
    "import random\n",
    "import numpy as np\n",
    "\n",
    "import torch\n",
    "import torch.nn as nn\n",
    "import torchvision.transforms as transforms\n",
    "\n",
    "import nibabel as nib\n",
    "import cv2\n",
    "\n",
    "import SimpleITK as sitk\n",
    "from PIL import Image\n",
    "from collections import defaultdict\n",
    "from torch.utils.data import Dataset\n",
    "# from pycox.preprocessing.label_transforms import LabTransDiscreteTime\n",
    "\n",
    "from monai.transforms import (\n",
    "    AsDiscrete,\n",
    "    AsDiscreted,\n",
    "    EnsureChannelFirstd,\n",
    "    Compose,\n",
    "    LoadImaged,\n",
    "    RandSpatialCropd,\n",
    "    CenterSpatialCropd,\n",
    "    EnsureChannelFirstd,\n",
    "    RandFlipd,\n",
    "    Resized,\n",
    "    ScaleIntensityRangePercentilesd,\n",
    "    NormalizeIntensityd,\n",
    "    Identity,\n",
    "    EnsureTyped\n",
    ")\n",
    "\n",
    "from monai.handlers.utils import from_engine\n",
    "# https://docs.monai.io/en/stable/networks.html#nets\n",
    "from monai.networks.nets import UNet,AttentionUnet, DynUNet, SegResNet, VNet, SegResNetVAE, UNETR\n",
    "from monai.networks.layers import Norm\n",
    "from monai.metrics import DiceMetric\n",
    "from monai.losses import DiceLoss\n",
    "from monai.inferers import sliding_window_inference\n",
    "from monai.data import CacheDataset, DataLoader, Dataset, decollate_batch\n",
    "from monai.config import print_config\n",
    "from monai.apps import download_and_extract\n",
    "import aim\n",
    "from aim.pytorch import track_gradients_dists, track_params_dists\n",
    "import matplotlib.pyplot as plt\n",
    "import tempfile\n",
    "import shutil\n",
    "import os\n",
    "import glob\n",
    "np.set_printoptions(threshold=np.inf)\n",
    "random.seed(7777)\n",
    "np.random.seed(7777)"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "b5185f9b-b3d4-4080-bb70-1eb37be3a489",
   "metadata": {},
   "source": [
    "# [来自论文的代码](https://github.com/xmed-lab/GraphEcho/blob/main/train_cardiac_uda.py#L108)\n",
    "逻辑比较复杂，好像在搞迁移学习 \n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "id": "9ce4fb0f-78dd-410b-ab93-34b5c75e2267",
   "metadata": {},
   "outputs": [],
   "source": [
    "\n",
    "class Seg_Cardiac_UDA_Dataset(Dataset):\n",
    "    def __init__(self, infos, root, is_train, repeat=1, data_list=None, set_select=['Site_G'], view_num=['2'], label_type='mPAP', \n",
    "                 spatial_size=328, crop_size=256, transform=None, single_frame=True, total_length=40, clip_length=8, seg_parts=True, source_domain=True, fill_mask=False):\n",
    "        self.rort = root\n",
    "        self.is_train = is_train\n",
    "        self.set_select = set_select\n",
    "        self.view_num = view_num\n",
    "        self.spatial_size = spatial_size\n",
    "        self.crop_size = crop_size\n",
    "        self.single_frame = single_frame\n",
    "        self.total_length = total_length\n",
    "        self.clip_length = clip_length\n",
    "        self.seg_parts = seg_parts\n",
    "        self.source_domain = source_domain\n",
    "        self.fill_mask = fill_mask\n",
    "        self.repeat = repeat\n",
    "        self.transform = self.get_transform(is_train)\n",
    "\n",
    "        self.data_dict, _ = self.get_dict(infos)\n",
    "        self.id_list = list(self.data_dict.keys())\n",
    "\n",
    "        if is_train:\n",
    "            self.train_list = random.sample(self.id_list, int(len(self.id_list) * 0.9))\n",
    "            self.valid_list = random.sample(self.train_list, int(len(self.train_list) * 0.1))\n",
    "            self.test_list = list(set(self.id_list).difference(set(self.train_list)))\n",
    "            self.id_list = self.train_list\n",
    "        elif (is_train is False and data_list is not None):\n",
    "            self.id_list = data_list\n",
    "\n",
    "        self.num_data = len(self.id_list)\n",
    "\n",
    "    def __getitem__(self, index):\n",
    "\n",
    "        def get_info_dict(index):\n",
    "            index = index // self.repeat\n",
    "            id = self.id_list[index]\n",
    "            current_input_dir = dict()\n",
    "            images = self.data_dict[id]['images']\n",
    "            masks  = self.data_dict[id]['masks']\n",
    "            for k in self.view_num:\n",
    "                if self.single_frame:\n",
    "                    if (k in images.keys() and k in masks.keys()):\n",
    "                        if (images[k] is not None and masks[k] is not None):\n",
    "                            image_list = np.array(nib.load(images[k]).dataobj)\n",
    "                            print(images[k])\n",
    "                            print(image_list.shape)\n",
    "                            mask_list  = np.array(nib.load(masks[k]).dataobj)\n",
    "                            select_images_, select_masks_, mask_index = self.input_select(image_list, mask_list)\n",
    "                            if mask_index == None:\n",
    "                                continue\n",
    "                            if np.sum(select_masks_) < 100:\n",
    "                                continue\n",
    "                            else:\n",
    "                                current_input_dir[k] = {'images':select_images_, 'masks':select_masks_}\n",
    "                else:\n",
    "                    if k in images.keys():\n",
    "                        if (images[k] is not None and masks[k] is not None):\n",
    "                            image_list = np.array(nib.load(images[k]).dataobj)\n",
    "                            if masks[k] is not None:\n",
    "                                mask_list  = np.array(nib.load(masks[k]).dataobj)\n",
    "                            else:\n",
    "                                mask_list  = torch.zeros(image_list.shape)\n",
    "                            \n",
    "                            if len(image_list.shape) == 3:\n",
    "                                video_length = image_list.shape[-1]\n",
    "                                sample_rate = int(self.total_length/self.clip_length)\n",
    "                                if video_length >= self.clip_length:\n",
    "                                    if video_length < self.clip_length * sample_rate:\n",
    "                                        sample_rate = video_length // self.clip_length\n",
    "                                    start_index = random.randint(0, video_length - self.clip_length * sample_rate)\n",
    "                                    end_index = start_index + self.clip_length\n",
    "                                    select_images_ = image_list[:, :, start_index:end_index:sample_rate]\n",
    "                                    select_masks_  = mask_list[:, :, start_index:end_index:sample_rate]\n",
    "                                    mask_frames_ = np.sum(select_masks_, axis=(0,1))\n",
    "                                    mask_index = np.where(mask_frames_ > 100, 1, 0)\n",
    "                                    if self.fill_mask:\n",
    "                                        select_masks_ = self.contour_to_mask(select_masks_)\n",
    "                                    current_input_dir[k] = {'images':select_images_, 'masks':select_masks_}\n",
    "                                elif video_length < self.clip_length:\n",
    "                                    continue\n",
    "\n",
    "                            elif len(image_list.shape) == 2:\n",
    "                                continue\n",
    "\n",
    "            while not current_input_dir:\n",
    "                index = random.randint(0, self.num_data-1)\n",
    "                current_input_dir, mask_index, index = get_info_dict(index)\n",
    "\n",
    "            return current_input_dir, mask_index, index\n",
    "\n",
    "        current_input_dir, mask_index, index = get_info_dict(index)\n",
    "\n",
    "        if self.seg_parts:\n",
    "            if self.view_num   == ['1']:\n",
    "                BG = np.where(current_input_dir[self.view_num[0]]['masks'] == 0, 1, 0)\n",
    "                LV = np.where(current_input_dir[self.view_num[0]]['masks'] == 1, 1, 0)\n",
    "                RV = np.where(current_input_dir[self.view_num[0]]['masks'] == 2, 1, 0)\n",
    "                current_input_dir[self.view_num[0]]['masks'] = np.stack([BG, LV, RV], axis=0)\n",
    "            elif self.view_num == ['2']:\n",
    "                BG = np.where(current_input_dir[self.view_num[0]]['masks'] == 0, 1, 0)\n",
    "                PA = np.where(current_input_dir[self.view_num[0]]['masks'] == 1, 1, 0)\n",
    "                current_input_dir[self.view_num[0]]['masks'] = np.stack([BG, PA], axis=0)\n",
    "            elif self.view_num == ['3']:\n",
    "                BG = np.where(current_input_dir[self.view_num[0]]['masks'] == 0, 1, 0)\n",
    "                LV = np.where(current_input_dir[self.view_num[0]]['masks'] == 1, 1, 0)\n",
    "                RV = np.where(current_input_dir[self.view_num[0]]['masks'] == 2, 1, 0)\n",
    "                current_input_dir[self.view_num[0]]['masks'] = np.stack([BG, LV, RV], axis=0)\n",
    "            elif self.view_num == ['4']:\n",
    "                BG = np.where(current_input_dir[self.view_num[0]]['masks'] == 0, 1, 0)\n",
    "                LV = np.where(current_input_dir[self.view_num[0]]['masks'] == 1, 1, 0)\n",
    "                LA = np.where(current_input_dir[self.view_num[0]]['masks'] == 2, 1, 0)\n",
    "                RA = np.where(current_input_dir[self.view_num[0]]['masks'] == 3, 1, 0)\n",
    "                RV = np.where(current_input_dir[self.view_num[0]]['masks'] == 4, 1, 0)\n",
    "                current_input_dir[self.view_num[0]]['masks'] = np.stack([BG, LV, LA, RA, RV], axis=0)\n",
    "        else:\n",
    "            current_input_dir[self.view_num[0]]['masks'] = np.where(current_input_dir[self.view_num[0]]['masks'] > 0, 1, 0)\n",
    "        \n",
    "        current_input_dir[self.view_num[0]] = self.transform(current_input_dir[self.view_num[0]])\n",
    "        \n",
    "        return current_input_dir[self.view_num[0]]['images'] / 255.0, current_input_dir[self.view_num[0]]['masks'], mask_index, index\n",
    "\n",
    "    def __len__(self):\n",
    "        if self.is_train:\n",
    "            return self.num_data * self.repeat\n",
    "        else:\n",
    "            return self.num_data\n",
    "\n",
    "    def is_number(self, s):\n",
    "        try:\n",
    "            float(s)\n",
    "            return True\n",
    "        except ValueError:\n",
    "            pass\n",
    "     \n",
    "        try:\n",
    "            import unicodedata\n",
    "            unicodedata.numeric(s)\n",
    "            return True\n",
    "        except (TypeError, ValueError):\n",
    "            pass\n",
    "     \n",
    "        return False\n",
    "\n",
    "    def get_dict(self, infos):\n",
    "\n",
    "        selected_dict = dict()\n",
    "        # dict{\n",
    "        #       center_name: {\n",
    "        #                     file: {\n",
    "        #                            views_images: {image_path},\n",
    "        #                            views_labels: {label_path},\n",
    "        #                           }\n",
    "        #                    }\n",
    "        #      }\n",
    "        for k, v in infos.items():\n",
    "            if v['dataset_name'] in self.set_select:\n",
    "                selected_dict[k]['images'] = v['views_images']\n",
    "                selected_dict[k]['masks']  = v['views_labels']\n",
    "\n",
    "        return selected_dict, None\n",
    "\n",
    "    def input_select(self, images, masks):\n",
    "        if len(masks.shape) == 3:\n",
    "            mask_frames_ = np.sum(masks, axis=(0,1))\n",
    "            mask_frames_ = np.where(mask_frames_ > 100, 1, 0)\n",
    "            mask_frames_ = np.argwhere(mask_frames_ == 1)\n",
    "\n",
    "            if mask_frames_.size == 0:\n",
    "                return None, None, None\n",
    "\n",
    "            select_index = random.choice(mask_frames_)[0]\n",
    "            \n",
    "            if self.single_frame:\n",
    "                return images[:, :, select_index], masks[:, :, select_index], select_index\n",
    "            else:\n",
    "                if masks.shape[-1] == 3:\n",
    "                    images = np.tile(images[:, :, 1:2],(1,1,self.clip_length))\n",
    "                    masks  = np.tile(masks[:, :, 1:2], (1,1,self.clip_length))\n",
    "                else:\n",
    "                    r_index = random.randint(0, select_index if select_index < self.clip_length-1 else self.clip_length-1)\n",
    "                    start = select_index - r_index\n",
    "                    end = start + self.clip_length - 1\n",
    "                    images = images[:, :, start:end]\n",
    "                    masks  = masks[:, :, start:end]\n",
    "                    select_index = r_index\n",
    "\n",
    "                return images, masks, np.array([select_index])\n",
    "        else:\n",
    "            if self.single_frame:\n",
    "                return images, masks, 0\n",
    "            else:\n",
    "                return np.tile(images,(self.clip_length,1,1)).transpose(1,2,0), np.tile(masks,(self.clip_length,1,1)).transpose(1,2,0), 0\n",
    "\n",
    "    def contour_to_mask(self, input):\n",
    "        organ_num = {'1':2,'2':1,'3':2,'4':4}\n",
    "        masks = list()\n",
    "        all_cls = list(set(list(input.reshape(-1))))\n",
    "        all_cls.remove(0)\n",
    "\n",
    "        h, w, _ = input.shape\n",
    "        clip_length = input.shape[-1]\n",
    "        for i in range(clip_length):\n",
    "            contour = input[:,:,i]\n",
    "            mask = np.zeros((h,w))\n",
    "            for cls in range(1,organ_num[self.view_num[0]]+1):\n",
    "                if cls>len(all_cls):\n",
    "                    break\n",
    "                contour_xy = np.argwhere(contour==all_cls[cls-1])\n",
    "                img = np.zeros((h, w, 3), np.uint8)\n",
    "                if list(contour_xy)!=[]:\n",
    "                    cv2.fillPoly(img, [contour_xy], (255, 255, 255))\n",
    "                    mask_xy = np.argwhere(img[:,:,0]==255)\n",
    "                    for idx in mask_xy:\n",
    "                        mask[idx[1],idx[0]] = cls\n",
    "            mask = np.expand_dims(mask, axis=-1)\n",
    "            masks.append(mask)\n",
    "        return np.concatenate(masks, axis=-1)\n",
    "\n",
    "    def get_transform(self, is_train):\n",
    "        all_keys = ['images', 'masks']\n",
    "        \n",
    "        if self.single_frame:\n",
    "            spatial_size = (self.spatial_size, self.spatial_size)\n",
    "            crop_size = (self.crop_size, self.crop_size)\n",
    "        else:\n",
    "            spatial_size = (self.spatial_size, self.spatial_size, self.clip_length)\n",
    "            crop_size = (self.crop_size, self.crop_size, self.clip_length)\n",
    "        \n",
    "        if is_train:\n",
    "            \n",
    "            rf0 = RandFlipd(keys=all_keys, prob=0.5, spatial_axis=0)\n",
    "            rf1 = RandFlipd(keys=all_keys, prob=0.5, spatial_axis=1)\n",
    "            rf2 = RandFlipd(keys=all_keys, prob=0.5, spatial_axis=2) if not self.single_frame else None\n",
    "\n",
    "            rf0.set_random_state(0)\n",
    "            rf1.set_random_state(0)\n",
    "            if rf2 is not None:\n",
    "                rf2.set_random_state(0)\n",
    "\n",
    "            transform = Compose([\n",
    "                    EnsureChannelFirstd(keys=['images'] if self.seg_parts else all_keys, allow_missing_keys=True),\n",
    "                    Resized(keys=all_keys, spatial_size=spatial_size, allow_missing_keys=True, mode='nearest'),\n",
    "                    RandSpatialCropd(all_keys, crop_size, random_size=False, allow_missing_keys=True),\n",
    "                    #ScaleIntensityRangePercentilesd(keys=all_keys, lower=5, upper=95, b_min=0., b_max=1., allow_missing_keys=True) if len(all_keys)>0 else Identity(),\n",
    "                    #NormalizeIntensityd(keys=all_keys, subtrahend=0.5, divisor=0.5),\n",
    "                    EnsureTyped(keys=all_keys, allow_missing_keys=True),\n",
    "                ])\n",
    "        else:\n",
    "            transform = Compose([\n",
    "                    EnsureChannelFirstd(keys=['images'] if self.seg_parts else all_keys, allow_missing_keys=True),\n",
    "                    Resized(keys=all_keys, spatial_size=spatial_size, allow_missing_keys=True, mode='nearest'),\n",
    "                    CenterSpatialCropd(keys=all_keys, roi_size=crop_size, allow_missing_keys=True),\n",
    "                    #ScaleIntensityRangePercentilesd(keys=all_keys, lower=5, upper=95, b_min=0., b_max=1., allow_missing_keys=True) if len(all_keys)>0 else Identity(),\n",
    "                    #NormalizeIntensityd(keys=all_keys, subtrahend=0.5, divisor=0.5),\n",
    "                    EnsureTyped(keys=all_keys, allow_missing_keys=True),\n",
    "                ])\n",
    "        return transform"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "id": "983fc17e-2214-438d-9d01-7008faa657e6",
   "metadata": {},
   "outputs": [],
   "source": [
    "# your dataset root -> for example : '.../Cardiac_UDA'\n",
    "root = '/mnt/datawow/lyq/dataset/cardiacUDC_dataset/' \n",
    "# the infos of data, you need to generate .npy file before you use this dataset\n",
    "# The .npy should includ a dict that include both Site G and Site R\n",
    "# The layer of the dict should be :\n",
    "\n",
    "# dict{\n",
    "#       center_name: {\n",
    "#                     file: {\n",
    "#                            views_images: {image_path},\n",
    "#                            views_labels: {label_path},\n",
    "#                           }\n",
    "#                    }\n",
    "#      }\n",
    "\n",
    "# infos = np.load(f'your dataset root/infos.npy', allow_pickle=True).item()\n",
    "\n",
    "# train_dataset_source = Seg_Cardiac_UDA_Dataset(infos, root, is_train=True, set_select=['Site_G'], view_num=self.view_num, seg_parts=self.seg_parts)\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "id": "7af0ec1e-a3a5-4ffc-8910-189f1ba69ee6",
   "metadata": {},
   "outputs": [],
   "source": [
    "from monai.data import CacheDataset, DataLoader, Dataset, decollate_batch\n",
    "import matplotlib.pyplot as plt\n",
    "from monai.transforms import (\n",
    "    EnsureChannelFirstd,\n",
    "    Compose,\n",
    "    LoadImaged,\n",
    "    RandSpatialCropd,\n",
    "    CenterSpatialCropd,\n",
    "    EnsureChannelFirstd,\n",
    "    RandFlipd,\n",
    "    Resized,\n",
    "    ScaleIntensityRangePercentilesd,\n",
    "    NormalizeIntensityd,\n",
    "    Identity,\n",
    "    EnsureTyped,\n",
    "MapTransform\n",
    ")\n",
    "import numpy as np\n",
    "import random"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "id": "24af8481-1a35-4890-b868-fbe46e4233b6",
   "metadata": {},
   "outputs": [],
   "source": [
    "from glob import glob\n",
    "root = '/mnt/datawow/lyq/dataset/cardiacUDC_dataset/' \n",
    "labels = glob(root+'Site_G_100/*_label.nii.gz')\n",
    "\n",
    "images = [i.replace('label','image') for i in labels]\n",
    "\n",
    "data_dicts = [{\"image\": image_name, \"label\": label_name} for image_name, label_name in zip(images, labels)]\n",
    "train_num = int(len(data_dicts)*0.7)\n",
    "train_files, val_files = data_dicts[:-train_num], data_dicts[-train_num:]\n",
    "\n",
    "all_keys = ['image', 'label']\n",
    "spatial_size=(328,328)\n",
    "crop_size=(256,256)\n",
    "label_list = [1,2]\n",
    "\n",
    "class RetainSpecificMaskValues(MapTransform):\n",
    "    def __init__(self, keys, value_list, allow_missing_keys=False):\n",
    "        super().__init__(keys, allow_missing_keys)\n",
    "        self.value_list = value_list\n",
    "\n",
    "    def __call__(self, data):\n",
    "        d = dict(data)\n",
    "        for key in self.keys:\n",
    "            mask = np.isin(d[key], self.value_list)\n",
    "            d[key] = np.where(mask, d[key], 0)\n",
    "        return d\n",
    "\n",
    "class ChooseRandomLayer(MapTransform):\n",
    "    def __init__(self, keys, allow_missing_keys=False):\n",
    "        super().__init__(keys, allow_missing_keys)\n",
    "\n",
    "    def __call__(self, data):\n",
    "        d = dict(data)\n",
    "        image, mask =d['image'], d['label']\n",
    "        mask_frames_ = np.sum(mask, axis=(0,1))\n",
    "        mask_frames_ = np.where(mask_frames_ > 100, 1, 0)\n",
    "        mask_frames_ = np.argwhere(mask_frames_ == 1)\n",
    "        select_index = random.choice(mask_frames_)[0]\n",
    "        # selected_image = image[:, :, select_index]\n",
    "        # selected_mask = mask[:, :, select_index]\n",
    "        for key in self.keys:\n",
    "            # mask = np.isin(d[key], self.value_list)\n",
    "            d[key] = d[key][:, :, select_index]\n",
    "            # print(key, d[key].shape)\n",
    "        return d\n",
    "\n",
    "train_transforms = Compose([\n",
    "        LoadImaged(keys=[\"image\", \"label\"]),\n",
    "        ChooseRandomLayer(keys=all_keys),\n",
    "        RetainSpecificMaskValues(keys=[\"label\"], value_list=label_list),\n",
    "        EnsureChannelFirstd(keys=all_keys,channel_dim='no_channel' ),\n",
    "        Resized(keys=all_keys, spatial_size=spatial_size, allow_missing_keys=True, mode='nearest'),\n",
    "        RandSpatialCropd(all_keys, crop_size, random_size=False, allow_missing_keys=True),\n",
    "        #ScaleIntensityRangePercentilesd(keys=all_keys, lower=5, upper=95, b_min=0., b_max=1., allow_missing_keys=True) if len(all_keys)>0 else Identity(),\n",
    "        #NormalizeIntensityd(keys=all_keys, subtrahend=0.5, divisor=0.5),\n",
    "        EnsureTyped(keys=all_keys, allow_missing_keys=True),\n",
    "    ])\n",
    "\n",
    "val_transforms = Compose([\n",
    "        LoadImaged(keys=[\"image\", \"label\"]),\n",
    "        ChooseRandomLayer(keys=all_keys),\n",
    "        RetainSpecificMaskValues(keys=[\"label\"], value_list=label_list),\n",
    "        EnsureChannelFirstd(keys=all_keys,channel_dim='no_channel' ),\n",
    "        Resized(keys=all_keys, spatial_size=spatial_size, allow_missing_keys=True, mode='nearest'),\n",
    "        # RandSpatialCropd(all_keys, crop_size, random_size=False, allow_missing_keys=True),\n",
    "        #ScaleIntensityRangePercentilesd(keys=all_keys, lower=5, upper=95, b_min=0., b_max=1., allow_missing_keys=True) if len(all_keys)>0 else Identity(),\n",
    "        #NormalizeIntensityd(keys=all_keys, subtrahend=0.5, divisor=0.5),\n",
    "        EnsureTyped(keys=all_keys, allow_missing_keys=True),\n",
    "    ])"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "id": "9394634f-a12c-462d-993a-29cff056d4e7",
   "metadata": {
    "scrolled": true
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "torch.Size([1, 1, 328, 328]) torch.Size([1, 1, 328, 328]) (array([  0.,   1.,   2.,   3.,   4.,   5.,   6.,   7.,   8.,   9.,  10.,\n",
      "        11.,  12.,  13.,  14.,  15.,  16.,  17.,  18.,  19.,  20.,  21.,\n",
      "        22.,  23.,  24.,  25.,  26.,  27.,  28.,  29.,  30.,  31.,  32.,\n",
      "        33.,  34.,  35.,  36.,  37.,  38.,  39.,  40.,  41.,  42.,  43.,\n",
      "        44.,  45.,  46.,  47.,  48.,  50.,  51.,  52.,  53.,  55.,  56.,\n",
      "        57.,  59.,  60.,  61.,  62.,  63.,  64.,  66.,  67.,  68.,  69.,\n",
      "        70.,  72.,  73.,  74.,  75.,  76.,  77.,  79.,  80.,  81.,  82.,\n",
      "        83.,  85.,  86.,  88.,  89.,  90.,  91.,  92.,  93.,  94.,  95.,\n",
      "        97.,  98.,  99., 100., 101., 102., 103., 104., 105., 106., 107.,\n",
      "       108., 109., 110., 111., 113., 114., 115., 116., 117., 119., 120.,\n",
      "       122., 123., 124., 126., 127., 128., 129., 130., 131., 133., 134.,\n",
      "       135., 137., 138., 139., 140., 141., 142., 143., 144., 145., 146.,\n",
      "       147., 148., 149., 150., 151., 152., 153., 154., 155., 156., 157.,\n",
      "       158., 160., 161., 162., 163., 164., 165., 167., 168., 169., 170.,\n",
      "       171., 172., 173., 174., 175., 177., 178., 179., 180., 181., 182.,\n",
      "       183., 184., 185., 186., 187., 188., 189., 190., 191., 192., 193.,\n",
      "       194., 195., 196., 197., 198., 199., 200., 201., 202., 203., 204.,\n",
      "       205., 206., 207., 208., 209., 210., 211., 212., 213., 214., 215.,\n",
      "       216., 217., 218., 219., 220., 221., 222., 223., 224., 225., 226.,\n",
      "       227., 228., 229., 230., 231., 232., 233., 234., 235., 236., 237.,\n",
      "       238., 239., 240., 241., 242., 243., 244., 245., 246., 247., 248.,\n",
      "       249., 250., 251., 252., 253., 254., 255.], dtype=float32), array([84157,   218,   208,   233,   235,   251,   233,   246,   466,\n",
      "         252,   258,   494,   260,   517,   290,   240,   509,   279,\n",
      "         285,   535,   264,   259,   537,   240,   248,   256,   275,\n",
      "         276,   232,   216,   507,   227,   197,   213,     5,   246,\n",
      "         219,   220,   209,   197,   194,   192,   177,   216,     5,\n",
      "         185,   209,   205,   192,   167,   151,   162,   148,   170,\n",
      "         161,   169,   144,   163,     1,   154,   150,   158,   166,\n",
      "         127,     5,   144,   128,   143,   136,   118,     4,   108,\n",
      "         116,   128,   114,    16,   111,   125,   110,   110,   111,\n",
      "         104,     1,   107,    98,     7,   104,   109,    97,    90,\n",
      "           1,    94,    92,     6,    84,    87,     1,    89,    83,\n",
      "           1,    67,   101,   128,    88,    64,     5,    78,    79,\n",
      "          78,    69,    78,    78,    73,    67,    58,     1,    55,\n",
      "          70,    61,    47,    60,    58,    50,    62,    52,    25,\n",
      "          50,    57,    55,     6,    39,    53,    57,    50,     1,\n",
      "          38,    43,    56,    38,    12,    30,    42,    36,    39,\n",
      "          53,    43,    38,    45,    29,    21,   188,    44,    40,\n",
      "          33,    35,    30,    28,    32,    25,    30,    35,    28,\n",
      "          39,    23,   114,    30,    31,    25,    31,    22,    28,\n",
      "          34,    29,    19,    37,    17,    27,    25,    24,    33,\n",
      "          24,    34,    23,    24,    35,    54,    12,    24,    24,\n",
      "           9,    44,    27,    12,    19,    41,    18,    27,    17,\n",
      "          24,    51,    19,    26,    12,    40,    23,    19,    13,\n",
      "          46,    13,    20,    35,    10,    32,     9,    33,    33,\n",
      "          25,    14,    20,    15,    25,    17,    17,    17,    16,\n",
      "           4,    11,    17,    14,     3,    41,    10,     9,     6,\n",
      "           7,    11,     6,   677]))\n",
      "torch.Size([1, 1, 328, 328]) torch.Size([1, 1, 328, 328]) (array([  0.,   1.,   2.,   3.,   4.,   5.,   6.,   7.,   8.,   9.,  10.,\n",
      "        11.,  12.,  13.,  14.,  15.,  16.,  17.,  18.,  19.,  20.,  21.,\n",
      "        22.,  23.,  24.,  25.,  26.,  27.,  28.,  29.,  30.,  31.,  32.,\n",
      "        33.,  35.,  36.,  37.,  38.,  39.,  40.,  41.,  42.,  43.,  45.,\n",
      "        46.,  47.,  48.,  50.,  51.,  52.,  53.,  55.,  56.,  57.,  59.,\n",
      "        60.,  62.,  63.,  64.,  66.,  67.,  69.,  70.,  72.,  73.,  74.,\n",
      "        76.,  77.,  79.,  80.,  82.,  83.,  85.,  86.,  88.,  89.,  91.,\n",
      "        92.,  94.,  95.,  97.,  98., 100., 101., 103., 104., 106., 107.,\n",
      "       109., 110., 111., 113., 114., 116., 117., 119., 120., 122., 123.,\n",
      "       124., 126., 127., 129., 130., 131., 133., 134., 135., 137., 138.,\n",
      "       139., 141., 142., 143., 145., 146., 147., 148., 150., 151., 152.,\n",
      "       153., 155., 156., 157., 158., 160., 161., 162., 163., 164., 165.,\n",
      "       167., 168., 169., 170., 171., 172., 173., 174., 175., 177., 178.,\n",
      "       179., 180., 181., 182., 183., 184., 185., 186., 187., 188., 189.,\n",
      "       190., 191., 192., 193., 194., 195., 196., 197., 198., 199., 200.,\n",
      "       201., 202., 203., 204., 205., 206., 207., 208., 209., 210., 211.,\n",
      "       212., 213., 214., 215., 216., 217., 218., 219., 220., 221., 222.,\n",
      "       223., 224., 225., 226., 227., 228., 229., 230., 231., 232., 233.,\n",
      "       234., 235., 236., 237., 238., 239., 240., 241., 242., 243., 244.,\n",
      "       245., 246., 249., 251.], dtype=float32), array([73400,   344,   302,   335,   313,   369,   306,   330,   701,\n",
      "         354,   382,   749,   388,   750,   355,   388,   743,   375,\n",
      "         376,   757,   311,   342,   681,   319,   299,   324,   353,\n",
      "         323,   321,   327,   594,   277,   289,   305,   309,   256,\n",
      "         304,   270,   272,   240,   265,   273,   265,   243,   262,\n",
      "         266,   233,   241,   242,   228,   273,   217,   186,   210,\n",
      "         243,   184,   197,   197,   209,   176,   229,   213,   186,\n",
      "         205,   201,   199,   193,   184,   182,   193,   179,   191,\n",
      "         188,   190,   180,   172,   153,   177,   169,   177,   156,\n",
      "         166,   166,   186,   164,   171,   182,   173,   166,   171,\n",
      "         152,   153,   187,   159,   171,   181,   149,   169,   144,\n",
      "         147,   156,   160,   152,   133,   142,   150,   128,   149,\n",
      "         119,   118,   131,   107,   131,   121,   143,   139,   150,\n",
      "         118,   139,   152,   129,   128,   129,   122,   131,   137,\n",
      "         143,   115,   128,   127,   102,    99,   115,   101,    91,\n",
      "         107,    98,    87,    90,    79,    70,    83,    93,    59,\n",
      "          73,    58,   166,    62,    56,    56,    72,    61,    55,\n",
      "          42,    50,    53,    54,    33,    37,    28,    34,    32,\n",
      "          29,    35,    39,    31,    30,    58,    19,    32,    21,\n",
      "          27,    26,    20,    19,    21,    46,    13,    18,    14,\n",
      "          10,    41,    16,    22,    13,    27,    15,    15,    14,\n",
      "          19,     9,    12,    24,     8,    10,    14,     9,     6,\n",
      "           9,     5,     9,     6,    14,     5,     2,     1,     3,\n",
      "           2,     2,     1,     1,     1,     1]))\n",
      "torch.Size([1, 1, 328, 328]) torch.Size([1, 1, 328, 328]) (array([  0.,   1.,   2.,   3.,   4.,   5.,   6.,   7.,   8.,   9.,  10.,\n",
      "        11.,  12.,  13.,  14.,  15.,  16.,  17.,  18.,  19.,  20.,  21.,\n",
      "        22.,  23.,  24.,  25.,  26.,  27.,  28.,  29.,  30.,  31.,  32.,\n",
      "        33.,  35.,  36.,  37.,  38.,  39.,  40.,  41.,  42.,  43.,  45.,\n",
      "        46.,  47.,  48.,  50.,  51.,  52.,  53.,  55.,  56.,  57.,  59.,\n",
      "        60.,  62.,  63.,  64.,  66.,  67.,  69.,  70.,  72.,  73.,  74.,\n",
      "        76.,  77.,  79.,  80.,  82.,  83.,  85.,  86.,  88.,  89.,  91.,\n",
      "        92.,  94.,  95.,  97.,  98., 100., 101., 103., 104., 106., 107.,\n",
      "       109., 110., 111., 113., 114., 116., 117., 119., 120., 122., 123.,\n",
      "       124., 126., 127., 129., 130., 131., 133., 134., 135., 137., 138.,\n",
      "       139., 140., 141., 142., 143., 145., 146., 147., 148., 150., 151.,\n",
      "       152., 153., 155., 156., 157., 158., 160., 161., 162., 163., 164.,\n",
      "       165., 167., 168., 169., 170., 171., 172., 173., 174., 175., 177.,\n",
      "       178., 179., 180., 181., 182., 183., 184., 185., 186., 187., 188.,\n",
      "       189., 190., 191., 192., 193., 194., 195., 196., 197., 198., 199.,\n",
      "       200., 201., 202., 203., 204., 205., 206., 207., 208., 209., 210.,\n",
      "       211., 212., 213., 214., 215., 216., 217., 218., 219., 220., 221.,\n",
      "       222., 223., 224., 225., 226., 227., 228., 229., 230., 231., 232.,\n",
      "       233., 234., 235., 236., 237., 241., 242., 246., 248., 249.],\n",
      "      dtype=float32), array([61089,   332,   340,   341,   318,   301,   354,   367,   682,\n",
      "         389,   398,   680,   413,   743,   336,   408,   764,   357,\n",
      "         388,   820,   395,   414,   838,   406,   374,   399,   378,\n",
      "         371,   379,   405,   811,   358,   406,   409,   406,   395,\n",
      "         421,   420,   447,   445,   431,   397,   438,   378,   398,\n",
      "         402,   426,   404,   394,   413,   421,   360,   384,   434,\n",
      "         422,   405,   372,   409,   398,   395,   354,   379,   392,\n",
      "         396,   375,   367,   380,   384,   341,   351,   314,   357,\n",
      "         336,   303,   324,   313,   305,   314,   291,   313,   300,\n",
      "         285,   267,   326,   299,   283,   259,   276,   231,   231,\n",
      "         261,   226,   250,   244,   248,   250,   270,   249,   224,\n",
      "         248,   216,   223,   196,   196,   224,   235,   201,   192,\n",
      "         183,   173,   206,     2,   170,   153,   166,   160,   181,\n",
      "         172,   163,   176,   154,   177,   149,   141,   157,   140,\n",
      "         139,   153,   135,   157,   137,   142,   144,   140,   126,\n",
      "         126,   130,   117,   108,   129,   108,   109,   114,    85,\n",
      "          96,    94,    94,   136,    70,    69,    69,    94,    69,\n",
      "          63,    58,    68,    62,    35,    45,    56,    41,    30,\n",
      "          37,    38,    37,    27,    24,    36,    36,    18,    23,\n",
      "          23,    24,    30,    15,    20,    21,    38,    17,    15,\n",
      "          10,     9,    29,    10,    10,     7,    12,     9,     3,\n",
      "           5,    10,     5,     4,     2,     3,     3,     4,     1,\n",
      "           5,     1,     5,     1,     3,     1,     1,     1,     1,\n",
      "           2]))\n",
      "torch.Size([1, 1, 328, 328]) torch.Size([1, 1, 328, 328]) (array([  0.,   1.,   2.,   3.,   4.,   5.,   6.,   7.,   8.,   9.,  10.,\n",
      "        11.,  12.,  13.,  14.,  15.,  16.,  17.,  18.,  19.,  20.,  21.,\n",
      "        22.,  23.,  24.,  25.,  26.,  27.,  28.,  29.,  30.,  31.,  32.,\n",
      "        33.,  35.,  36.,  37.,  38.,  39.,  40.,  41.,  42.,  43.,  45.,\n",
      "        46.,  47.,  48.,  50.,  51.,  52.,  53.,  55.,  56.,  57.,  59.,\n",
      "        60.,  62.,  63.,  64.,  66.,  67.,  69.,  70.,  72.,  73.,  74.,\n",
      "        76.,  77.,  79.,  80.,  82.,  83.,  85.,  86.,  88.,  89.,  91.,\n",
      "        92.,  94.,  95.,  97.,  98., 100., 101., 103., 104., 106., 107.,\n",
      "       109., 110., 111., 113., 114., 116., 117., 119., 120., 122., 123.,\n",
      "       124., 126., 127., 129., 130., 131., 133., 134., 135., 137., 138.,\n",
      "       139., 141., 142., 143., 145., 146., 147., 148., 150., 151., 152.,\n",
      "       153., 155., 156., 157., 158., 160., 161., 162., 163., 164., 165.,\n",
      "       167., 168., 169., 170., 171., 172., 173., 174., 175., 177., 178.,\n",
      "       179., 180., 181., 182., 183., 184., 185., 186., 187., 188., 189.,\n",
      "       190., 191., 192., 193., 194., 195., 196., 197., 198., 199., 200.,\n",
      "       201., 202., 203., 204., 205., 206., 207., 208., 209., 210., 211.,\n",
      "       212., 213., 214., 215., 216., 217., 218., 219., 220., 221., 222.,\n",
      "       223., 224., 225., 226., 227., 228., 229., 230., 231., 232., 233.,\n",
      "       234., 236., 238., 239., 241., 242., 244., 245., 246.],\n",
      "      dtype=float32), array([76801,   247,   214,   221,   230,   225,   239,   213,   448,\n",
      "         200,   235,   413,   230,   456,   240,   219,   497,   209,\n",
      "         229,   471,   203,   181,   436,   211,   209,   236,   222,\n",
      "         205,   216,   184,   427,   199,   213,   243,   199,   188,\n",
      "         221,   249,   229,   209,   226,   243,   222,   212,   205,\n",
      "         215,   193,   242,   210,   216,   217,   239,   212,   218,\n",
      "         204,   204,   205,   204,   234,   206,   211,   213,   232,\n",
      "         225,   236,   196,   207,   176,   187,   180,   184,   193,\n",
      "         216,   202,   206,   218,   204,   191,   184,   189,   182,\n",
      "         188,   196,   201,   197,   171,   185,   174,   203,   184,\n",
      "         199,   167,   173,   195,   168,   160,   169,   157,   151,\n",
      "         161,   139,   160,   149,   154,   179,   168,   163,   140,\n",
      "         170,   185,   172,   188,   175,   209,   155,   162,   173,\n",
      "         159,   180,   143,   167,   162,   169,   145,   152,   179,\n",
      "         159,   139,   147,   162,   158,   136,   123,   148,   129,\n",
      "         124,   121,   111,   103,   129,   106,    97,   112,    98,\n",
      "         104,    95,   141,    92,    85,    91,   106,    91,    85,\n",
      "          85,    76,    77,    65,    65,    59,    59,    45,    49,\n",
      "          42,    44,    40,    35,    34,    60,    35,    27,    27,\n",
      "          15,    23,    11,    16,    20,    37,    12,     7,    10,\n",
      "          12,    28,     9,     4,     3,    13,     8,     1,     3,\n",
      "          13,     2,     3,     7,     1,     8,     5,     2,     3,\n",
      "           9,     1,     3,     1,     1,     1,     2,     1,     1]))\n",
      "torch.Size([1, 1, 328, 328]) torch.Size([1, 1, 328, 328]) (array([  0.,   1.,   2.,   3.,   4.,   5.,   6.,   7.,   8.,   9.,  10.,\n",
      "        11.,  12.,  13.,  14.,  15.,  16.,  17.,  18.,  19.,  20.,  21.,\n",
      "        22.,  23.,  24.,  25.,  26.,  27.,  28.,  29.,  30.,  31.,  32.,\n",
      "        33.,  35.,  36.,  37.,  38.,  39.,  40.,  41.,  42.,  43.,  45.,\n",
      "        46.,  47.,  48.,  50.,  51.,  52.,  53.,  55.,  56.,  57.,  59.,\n",
      "        60.,  62.,  63.,  64.,  66.,  67.,  69.,  70.,  72.,  73.,  74.,\n",
      "        76.,  77.,  79.,  80.,  82.,  83.,  85.,  86.,  88.,  89.,  91.,\n",
      "        92.,  94.,  95.,  97.,  98., 100., 101., 103., 104., 106., 107.,\n",
      "       109., 110., 111., 113., 114., 116., 117., 119., 120., 122., 123.,\n",
      "       124., 126., 127., 129., 130., 131., 133., 134., 135., 137., 138.,\n",
      "       139., 141., 142., 143., 145., 146., 147., 148., 150., 151., 152.,\n",
      "       153., 155., 156., 157., 158., 160., 161., 162., 163., 164., 165.,\n",
      "       167., 168., 169., 170., 171., 172., 173., 174., 175., 177., 178.,\n",
      "       179., 180., 181., 182., 183., 184., 185., 186., 187., 188., 189.,\n",
      "       190., 191., 192., 193., 194., 195., 196., 197., 198., 199., 200.,\n",
      "       201., 202., 203., 204., 205., 206., 207., 208., 209., 210., 211.,\n",
      "       212., 213., 214., 215., 216., 217., 218., 219., 220., 221., 222.,\n",
      "       223., 224., 225., 226., 227., 228., 230., 231., 232., 233., 236.],\n",
      "      dtype=float32), array([82485,   189,   170,   177,   191,   149,   180,   167,   300,\n",
      "         150,   200,   357,   148,   366,   177,   160,   364,   180,\n",
      "         180,   346,   197,   201,   352,   162,   192,   189,   191,\n",
      "         167,   164,   172,   353,   169,   164,   173,   149,   202,\n",
      "         211,   183,   194,   203,   184,   207,   188,   182,   173,\n",
      "         195,   199,   195,   191,   188,   195,   195,   220,   204,\n",
      "         211,   186,   195,   195,   188,   186,   181,   185,   193,\n",
      "         213,   224,   192,   205,   212,   206,   187,   194,   208,\n",
      "         220,   204,   211,   185,   225,   208,   229,   199,   184,\n",
      "         200,   197,   217,   202,   174,   180,   192,   196,   196,\n",
      "         192,   159,   172,   170,   171,   180,   157,   169,   153,\n",
      "         139,   155,   135,   124,   127,   138,   116,   128,   125,\n",
      "         121,    96,   127,   118,   127,   113,   106,   103,   107,\n",
      "          86,    82,    83,    86,    91,    88,    82,    82,    79,\n",
      "          82,    74,    69,    64,    77,    77,    72,    80,    54,\n",
      "          77,    79,    71,    59,    64,    68,    47,    55,    44,\n",
      "          49,    50,   200,    46,    39,    50,    38,    51,    43,\n",
      "          38,    40,    35,    30,    37,    42,    28,    26,    30,\n",
      "          31,    22,    31,    21,    31,    60,    23,    14,    19,\n",
      "          11,    18,    24,    19,    11,    35,    11,    10,    12,\n",
      "           6,    16,     5,     4,    10,    10,     2,     5,     6,\n",
      "           6,     1,     4,     6,     3,     1,     1,     2,     1]))\n"
     ]
    }
   ],
   "source": [
    "# train_ds = CacheDataset(data=train_files, transform=train_transforms, cache_rate=1.0, num_workers=4)\n",
    "train_ds = Dataset(data=train_files, transform=train_transforms)\n",
    "\n",
    "# use batch_size=2 to load images and use RandCropByPosNegLabeld\n",
    "# to generate 2 x 4 images for network training\n",
    "train_loader = DataLoader(train_ds, batch_size=2, shuffle=True, num_workers=2)\n",
    "\n",
    "# val_ds = CacheDataset(data=val_files, transform=val_transforms, cache_rate=1.0, num_workers=4)\n",
    "val_ds = Dataset(data=val_files, transform=val_transforms)\n",
    "val_loader = DataLoader(val_ds, batch_size=1, num_workers=4)\n",
    "\n",
    "step=0\n",
    "for batch_data in val_loader:\n",
    "    step+=1\n",
    "    inputs, labels = (\n",
    "        batch_data[\"image\"],\n",
    "        batch_data[\"label\"],\n",
    "    )\n",
    "    print(inputs.shape, labels.shape, np.unique(inputs,return_counts=True))\n",
    "    if step==5:\n",
    "        break"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 11,
   "id": "d15d4da3-41c7-4b85-88bc-35b24957431e",
   "metadata": {},
   "outputs": [],
   "source": [
    "device = torch.device(\"cuda:0\")\n",
    "device = torch.device(\"cpu\")\n",
    "\n",
    "num_classes = len(label_list)+1 # 选定的label个数+背景0\n",
    "UNet_meatdata = {\n",
    "    \"spatial_dims\": 2,\n",
    "    \"in_channels\": 1,\n",
    "    \"out_channels\": num_classes,\n",
    "     \"strides\": (2, 2, 2, 2),\n",
    "    \"num_res_units\": 2,\n",
    "    \"channels\":(4, 8, 16, 32, 64),\n",
    "    \"norm\": Norm.BATCH,\n",
    "}\n",
    "dataset_name = 'cardicUDA'\n",
    "model = UNet(**UNet_meatdata).to(device)\n",
    "loss_function = DiceLoss(to_onehot_y=True, softmax=True)\n",
    "loss_type = \"DiceLoss\"\n",
    "optimizer = torch.optim.Adam(model.parameters(), 1e-4)\n",
    "dice_metric = DiceMetric(include_background=False, reduction=\"mean\")\n",
    "model_name = f'{dataset_name}_{model.__class__.__name__}'"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "07820a83-4985-4b34-b3bf-adbfd97bc0a1",
   "metadata": {
    "scrolled": true
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "----------\n",
      "epoch 1/600\n",
      "1/15, train_loss: 0.7798\n",
      "2/15, train_loss: 0.7878\n",
      "3/15, train_loss: 0.7889\n",
      "4/15, train_loss: 0.7720\n",
      "5/15, train_loss: 0.7766\n",
      "6/15, train_loss: 0.7951\n",
      "7/15, train_loss: 0.7940\n",
      "8/15, train_loss: 0.7836\n",
      "9/15, train_loss: 0.7802\n",
      "10/15, train_loss: 0.7960\n",
      "11/15, train_loss: 0.7925\n",
      "12/15, train_loss: 0.8011\n",
      "13/15, train_loss: 0.7831\n",
      "14/15, train_loss: 0.7924\n",
      "15/15, train_loss: 0.7869\n",
      "epoch 1 average loss: 0.7873\n",
      "----------\n",
      "epoch 2/600\n",
      "1/15, train_loss: 0.7855\n",
      "2/15, train_loss: 0.7842\n",
      "3/15, train_loss: 0.7845\n",
      "4/15, train_loss: 0.7815\n",
      "5/15, train_loss: 0.7820\n",
      "6/15, train_loss: 0.7901\n",
      "7/15, train_loss: 0.7840\n",
      "8/15, train_loss: 0.7884\n",
      "9/15, train_loss: 0.7784\n",
      "10/15, train_loss: 0.7945\n",
      "11/15, train_loss: 0.7745\n",
      "12/15, train_loss: 0.7890\n",
      "13/15, train_loss: 0.7833\n",
      "14/15, train_loss: 0.7995\n",
      "15/15, train_loss: 0.7755\n",
      "epoch 2 average loss: 0.7850\n",
      "----------\n",
      "epoch 3/600\n",
      "1/15, train_loss: 0.7811\n",
      "2/15, train_loss: 0.7790\n",
      "3/15, train_loss: 0.7908\n",
      "4/15, train_loss: 0.7865\n",
      "5/15, train_loss: 0.7827\n",
      "6/15, train_loss: 0.7877\n",
      "7/15, train_loss: 0.7766\n",
      "8/15, train_loss: 0.7850\n",
      "9/15, train_loss: 0.7894\n",
      "10/15, train_loss: 0.7847\n",
      "11/15, train_loss: 0.7772\n",
      "12/15, train_loss: 0.7874\n",
      "13/15, train_loss: 0.7799\n",
      "14/15, train_loss: 0.7687\n",
      "15/15, train_loss: 0.7736\n",
      "epoch 3 average loss: 0.7820\n",
      "----------\n",
      "epoch 4/600\n",
      "1/15, train_loss: 0.7879\n",
      "2/15, train_loss: 0.7771\n",
      "3/15, train_loss: 0.7802\n",
      "4/15, train_loss: 0.7845\n",
      "5/15, train_loss: 0.7893\n",
      "6/15, train_loss: 0.7888\n",
      "7/15, train_loss: 0.7835\n",
      "8/15, train_loss: 0.7718\n",
      "9/15, train_loss: 0.7719\n",
      "10/15, train_loss: 0.7772\n",
      "11/15, train_loss: 0.7721\n",
      "12/15, train_loss: 0.7629\n",
      "13/15, train_loss: 0.7864\n",
      "14/15, train_loss: 0.7782\n",
      "15/15, train_loss: 0.7854\n",
      "epoch 4 average loss: 0.7798\n",
      "----------\n",
      "epoch 5/600\n",
      "1/15, train_loss: 0.7857\n",
      "2/15, train_loss: 0.7744\n",
      "3/15, train_loss: 0.7916\n",
      "4/15, train_loss: 0.7761\n",
      "5/15, train_loss: 0.7779\n",
      "6/15, train_loss: 0.7767\n",
      "7/15, train_loss: 0.7640\n",
      "8/15, train_loss: 0.7774\n",
      "9/15, train_loss: 0.7802\n",
      "10/15, train_loss: 0.7725\n",
      "11/15, train_loss: 0.7774\n",
      "12/15, train_loss: 0.7807\n",
      "13/15, train_loss: 0.7875\n",
      "14/15, train_loss: 0.7752\n",
      "15/15, train_loss: 0.7693\n",
      "epoch 5 average loss: 0.7778\n",
      "saved new best metric model at the 5th epoch\n",
      "current epoch: 5 current mean dice: 0.0660 \n",
      "best mean dice: 0.0660  at epoch: 5\n",
      "----------\n",
      "epoch 6/600\n",
      "1/15, train_loss: 0.7689\n",
      "2/15, train_loss: 0.7709\n",
      "3/15, train_loss: 0.7731\n",
      "4/15, train_loss: 0.7716\n",
      "5/15, train_loss: 0.7848\n",
      "6/15, train_loss: 0.7721\n",
      "7/15, train_loss: 0.7720\n",
      "8/15, train_loss: 0.7886\n",
      "9/15, train_loss: 0.7741\n",
      "10/15, train_loss: 0.7856\n",
      "11/15, train_loss: 0.7741\n",
      "12/15, train_loss: 0.7664\n",
      "13/15, train_loss: 0.7648\n",
      "14/15, train_loss: 0.7691\n",
      "15/15, train_loss: 0.7807\n",
      "epoch 6 average loss: 0.7744\n",
      "----------\n",
      "epoch 7/600\n",
      "1/15, train_loss: 0.7741\n",
      "2/15, train_loss: 0.7702\n",
      "3/15, train_loss: 0.7782\n",
      "4/15, train_loss: 0.7678\n",
      "5/15, train_loss: 0.7730\n",
      "6/15, train_loss: 0.7714\n",
      "7/15, train_loss: 0.7823\n",
      "8/15, train_loss: 0.7801\n",
      "9/15, train_loss: 0.7659\n",
      "10/15, train_loss: 0.7766\n",
      "11/15, train_loss: 0.7713\n",
      "12/15, train_loss: 0.7627\n",
      "13/15, train_loss: 0.7778\n",
      "14/15, train_loss: 0.7797\n",
      "15/15, train_loss: 0.7656\n",
      "epoch 7 average loss: 0.7731\n",
      "----------\n",
      "epoch 8/600\n",
      "1/15, train_loss: 0.7736\n",
      "2/15, train_loss: 0.7890\n",
      "3/15, train_loss: 0.7688\n",
      "4/15, train_loss: 0.7635\n",
      "5/15, train_loss: 0.7701\n",
      "6/15, train_loss: 0.7828\n",
      "7/15, train_loss: 0.7596\n",
      "8/15, train_loss: 0.7722\n",
      "9/15, train_loss: 0.7698\n",
      "10/15, train_loss: 0.7725\n",
      "11/15, train_loss: 0.7690\n",
      "12/15, train_loss: 0.7831\n",
      "13/15, train_loss: 0.7750\n",
      "14/15, train_loss: 0.7666\n",
      "15/15, train_loss: 0.7724\n",
      "epoch 8 average loss: 0.7725\n",
      "----------\n",
      "epoch 9/600\n",
      "1/15, train_loss: 0.7742\n",
      "2/15, train_loss: 0.7749\n",
      "3/15, train_loss: 0.7675\n",
      "4/15, train_loss: 0.7682\n",
      "5/15, train_loss: 0.7676\n",
      "6/15, train_loss: 0.7783\n",
      "7/15, train_loss: 0.7655\n",
      "8/15, train_loss: 0.7640\n",
      "9/15, train_loss: 0.7748\n",
      "10/15, train_loss: 0.7645\n",
      "11/15, train_loss: 0.7802\n",
      "12/15, train_loss: 0.7568\n",
      "13/15, train_loss: 0.7770\n",
      "14/15, train_loss: 0.7669\n",
      "15/15, train_loss: 0.7716\n",
      "epoch 9 average loss: 0.7701\n",
      "----------\n",
      "epoch 10/600\n",
      "1/15, train_loss: 0.7668\n",
      "2/15, train_loss: 0.7717\n",
      "3/15, train_loss: 0.7658\n",
      "4/15, train_loss: 0.7694\n",
      "5/15, train_loss: 0.7673\n",
      "6/15, train_loss: 0.7700\n",
      "7/15, train_loss: 0.7792\n",
      "8/15, train_loss: 0.7668\n",
      "9/15, train_loss: 0.7703\n",
      "10/15, train_loss: 0.7590\n",
      "11/15, train_loss: 0.7633\n",
      "12/15, train_loss: 0.7705\n",
      "13/15, train_loss: 0.7674\n",
      "14/15, train_loss: 0.7573\n",
      "15/15, train_loss: 0.7595\n",
      "epoch 10 average loss: 0.7670\n",
      "current epoch: 10 current mean dice: 0.0645 \n",
      "best mean dice: 0.0660  at epoch: 5\n",
      "----------\n",
      "epoch 11/600\n",
      "1/15, train_loss: 0.7686\n",
      "2/15, train_loss: 0.7728\n",
      "3/15, train_loss: 0.7704\n",
      "4/15, train_loss: 0.7688\n",
      "5/15, train_loss: 0.7682\n",
      "6/15, train_loss: 0.7808\n",
      "7/15, train_loss: 0.7586\n",
      "8/15, train_loss: 0.7593\n",
      "9/15, train_loss: 0.7747\n",
      "10/15, train_loss: 0.7653\n",
      "11/15, train_loss: 0.7625\n",
      "12/15, train_loss: 0.7590\n",
      "13/15, train_loss: 0.7570\n",
      "14/15, train_loss: 0.7644\n",
      "15/15, train_loss: 0.7683\n",
      "epoch 11 average loss: 0.7666\n",
      "----------\n",
      "epoch 12/600\n",
      "1/15, train_loss: 0.7585\n",
      "2/15, train_loss: 0.7574\n",
      "3/15, train_loss: 0.7632\n",
      "4/15, train_loss: 0.7614\n",
      "5/15, train_loss: 0.7722\n",
      "6/15, train_loss: 0.7641\n",
      "7/15, train_loss: 0.7704\n",
      "8/15, train_loss: 0.7644\n",
      "9/15, train_loss: 0.7635\n",
      "10/15, train_loss: 0.7712\n",
      "11/15, train_loss: 0.7629\n",
      "12/15, train_loss: 0.7530\n",
      "13/15, train_loss: 0.7673\n",
      "14/15, train_loss: 0.7603\n",
      "15/15, train_loss: 0.7578\n",
      "epoch 12 average loss: 0.7632\n",
      "----------\n",
      "epoch 13/600\n",
      "1/15, train_loss: 0.7564\n",
      "2/15, train_loss: 0.7629\n",
      "3/15, train_loss: 0.7735\n",
      "4/15, train_loss: 0.7613\n",
      "5/15, train_loss: 0.7696\n",
      "6/15, train_loss: 0.7645\n",
      "7/15, train_loss: 0.7640\n",
      "8/15, train_loss: 0.7758\n",
      "9/15, train_loss: 0.7553\n",
      "10/15, train_loss: 0.7536\n",
      "11/15, train_loss: 0.7583\n",
      "12/15, train_loss: 0.7667\n",
      "13/15, train_loss: 0.7619\n",
      "14/15, train_loss: 0.7598\n",
      "15/15, train_loss: 0.7596\n",
      "epoch 13 average loss: 0.7629\n",
      "----------\n",
      "epoch 14/600\n",
      "1/15, train_loss: 0.7585\n",
      "2/15, train_loss: 0.7504\n",
      "3/15, train_loss: 0.7620\n",
      "4/15, train_loss: 0.7632\n",
      "5/15, train_loss: 0.7732\n",
      "6/15, train_loss: 0.7589\n",
      "7/15, train_loss: 0.7589\n",
      "8/15, train_loss: 0.7567\n",
      "9/15, train_loss: 0.7659\n",
      "10/15, train_loss: 0.7620\n",
      "11/15, train_loss: 0.7650\n",
      "12/15, train_loss: 0.7577\n",
      "13/15, train_loss: 0.7654\n",
      "14/15, train_loss: 0.7510\n",
      "15/15, train_loss: 0.7444\n",
      "epoch 14 average loss: 0.7595\n",
      "----------\n",
      "epoch 15/600\n",
      "1/15, train_loss: 0.7634\n",
      "2/15, train_loss: 0.7632\n",
      "3/15, train_loss: 0.7588\n",
      "4/15, train_loss: 0.7585\n",
      "5/15, train_loss: 0.7641\n",
      "6/15, train_loss: 0.7549\n",
      "7/15, train_loss: 0.7509\n",
      "8/15, train_loss: 0.7559\n",
      "9/15, train_loss: 0.7561\n",
      "10/15, train_loss: 0.7639\n",
      "11/15, train_loss: 0.7501\n",
      "12/15, train_loss: 0.7623\n",
      "13/15, train_loss: 0.7587\n",
      "14/15, train_loss: 0.7539\n",
      "15/15, train_loss: 0.7513\n",
      "epoch 15 average loss: 0.7577\n",
      "current epoch: 15 current mean dice: 0.0618 \n",
      "best mean dice: 0.0660  at epoch: 5\n",
      "----------\n",
      "epoch 16/600\n",
      "1/15, train_loss: 0.7537\n",
      "2/15, train_loss: 0.7599\n",
      "3/15, train_loss: 0.7480\n",
      "4/15, train_loss: 0.7568\n",
      "5/15, train_loss: 0.7572\n",
      "6/15, train_loss: 0.7499\n",
      "7/15, train_loss: 0.7607\n",
      "8/15, train_loss: 0.7547\n",
      "9/15, train_loss: 0.7615\n",
      "10/15, train_loss: 0.7586\n",
      "11/15, train_loss: 0.7515\n",
      "12/15, train_loss: 0.7469\n",
      "13/15, train_loss: 0.7478\n",
      "14/15, train_loss: 0.7465\n",
      "15/15, train_loss: 0.7534\n",
      "epoch 16 average loss: 0.7538\n",
      "----------\n",
      "epoch 17/600\n",
      "1/15, train_loss: 0.7515\n",
      "2/15, train_loss: 0.7471\n",
      "3/15, train_loss: 0.7532\n",
      "4/15, train_loss: 0.7568\n",
      "5/15, train_loss: 0.7584\n",
      "6/15, train_loss: 0.7538\n",
      "7/15, train_loss: 0.7488\n",
      "8/15, train_loss: 0.7481\n",
      "9/15, train_loss: 0.7447\n",
      "10/15, train_loss: 0.7517\n",
      "11/15, train_loss: 0.7650\n",
      "12/15, train_loss: 0.7483\n",
      "13/15, train_loss: 0.7441\n",
      "14/15, train_loss: 0.7550\n",
      "15/15, train_loss: 0.7505\n",
      "epoch 17 average loss: 0.7518\n",
      "----------\n",
      "epoch 18/600\n",
      "1/15, train_loss: 0.7571\n",
      "2/15, train_loss: 0.7464\n",
      "3/15, train_loss: 0.7545\n",
      "4/15, train_loss: 0.7364\n",
      "5/15, train_loss: 0.7459\n",
      "6/15, train_loss: 0.7463\n",
      "7/15, train_loss: 0.7478\n",
      "8/15, train_loss: 0.7499\n",
      "9/15, train_loss: 0.7464\n",
      "10/15, train_loss: 0.7433\n",
      "11/15, train_loss: 0.7677\n",
      "12/15, train_loss: 0.7598\n",
      "13/15, train_loss: 0.7426\n",
      "14/15, train_loss: 0.7438\n",
      "15/15, train_loss: 0.7471\n",
      "epoch 18 average loss: 0.7490\n",
      "----------\n",
      "epoch 19/600\n",
      "1/15, train_loss: 0.7413\n",
      "2/15, train_loss: 0.7470\n",
      "3/15, train_loss: 0.7546\n",
      "4/15, train_loss: 0.7684\n",
      "5/15, train_loss: 0.7452\n",
      "6/15, train_loss: 0.7434\n",
      "7/15, train_loss: 0.7520\n",
      "8/15, train_loss: 0.7534\n",
      "9/15, train_loss: 0.7402\n",
      "10/15, train_loss: 0.7484\n",
      "11/15, train_loss: 0.7448\n",
      "12/15, train_loss: 0.7373\n",
      "13/15, train_loss: 0.7431\n",
      "14/15, train_loss: 0.7358\n",
      "15/15, train_loss: 0.7481\n",
      "epoch 19 average loss: 0.7469\n",
      "----------\n",
      "epoch 20/600\n",
      "1/15, train_loss: 0.7398\n",
      "2/15, train_loss: 0.7569\n",
      "3/15, train_loss: 0.7461\n",
      "4/15, train_loss: 0.7473\n",
      "5/15, train_loss: 0.7314\n",
      "6/15, train_loss: 0.7443\n",
      "7/15, train_loss: 0.7469\n",
      "8/15, train_loss: 0.7398\n",
      "9/15, train_loss: 0.7489\n",
      "10/15, train_loss: 0.7376\n",
      "11/15, train_loss: 0.7395\n",
      "12/15, train_loss: 0.7465\n",
      "13/15, train_loss: 0.7371\n",
      "14/15, train_loss: 0.7412\n",
      "15/15, train_loss: 0.7412\n",
      "epoch 20 average loss: 0.7430\n",
      "current epoch: 20 current mean dice: 0.0630 \n",
      "best mean dice: 0.0660  at epoch: 5\n",
      "----------\n",
      "epoch 21/600\n",
      "1/15, train_loss: 0.7341\n",
      "2/15, train_loss: 0.7353\n",
      "3/15, train_loss: 0.7462\n",
      "4/15, train_loss: 0.7535\n",
      "5/15, train_loss: 0.7470\n",
      "6/15, train_loss: 0.7363\n",
      "7/15, train_loss: 0.7326\n",
      "8/15, train_loss: 0.7322\n",
      "9/15, train_loss: 0.7448\n",
      "10/15, train_loss: 0.7575\n",
      "11/15, train_loss: 0.7404\n",
      "12/15, train_loss: 0.7424\n",
      "13/15, train_loss: 0.7388\n",
      "14/15, train_loss: 0.7335\n",
      "15/15, train_loss: 0.7404\n",
      "epoch 21 average loss: 0.7410\n",
      "----------\n",
      "epoch 22/600\n",
      "1/15, train_loss: 0.7374\n",
      "2/15, train_loss: 0.7425\n",
      "3/15, train_loss: 0.7372\n",
      "4/15, train_loss: 0.7313\n",
      "5/15, train_loss: 0.7384\n",
      "6/15, train_loss: 0.7358\n",
      "7/15, train_loss: 0.7362\n",
      "8/15, train_loss: 0.7479\n",
      "9/15, train_loss: 0.7409\n",
      "10/15, train_loss: 0.7403\n",
      "11/15, train_loss: 0.7248\n",
      "12/15, train_loss: 0.7344\n",
      "13/15, train_loss: 0.7321\n",
      "14/15, train_loss: 0.7350\n",
      "15/15, train_loss: 0.7576\n",
      "epoch 22 average loss: 0.7381\n",
      "----------\n",
      "epoch 23/600\n",
      "1/15, train_loss: 0.7411\n",
      "2/15, train_loss: 0.7385\n",
      "3/15, train_loss: 0.7351\n",
      "4/15, train_loss: 0.7245\n",
      "5/15, train_loss: 0.7336\n",
      "6/15, train_loss: 0.7374\n",
      "7/15, train_loss: 0.7214\n",
      "8/15, train_loss: 0.7414\n",
      "9/15, train_loss: 0.7388\n",
      "10/15, train_loss: 0.7327\n",
      "11/15, train_loss: 0.7427\n",
      "12/15, train_loss: 0.7306\n",
      "13/15, train_loss: 0.7150\n",
      "14/15, train_loss: 0.7369\n",
      "15/15, train_loss: 0.7404\n",
      "epoch 23 average loss: 0.7340\n",
      "----------\n",
      "epoch 24/600\n",
      "1/15, train_loss: 0.7398\n",
      "2/15, train_loss: 0.7255\n",
      "3/15, train_loss: 0.7349\n",
      "4/15, train_loss: 0.7396\n",
      "5/15, train_loss: 0.7293\n",
      "6/15, train_loss: 0.7294\n",
      "7/15, train_loss: 0.7294\n",
      "8/15, train_loss: 0.7403\n",
      "9/15, train_loss: 0.7269\n",
      "10/15, train_loss: 0.7206\n",
      "11/15, train_loss: 0.7260\n",
      "12/15, train_loss: 0.7322\n",
      "13/15, train_loss: 0.7430\n",
      "14/15, train_loss: 0.7253\n",
      "15/15, train_loss: 0.7241\n",
      "epoch 24 average loss: 0.7311\n",
      "----------\n",
      "epoch 25/600\n",
      "1/15, train_loss: 0.7370\n",
      "2/15, train_loss: 0.7277\n",
      "3/15, train_loss: 0.7213\n",
      "4/15, train_loss: 0.7114\n",
      "5/15, train_loss: 0.7204\n",
      "6/15, train_loss: 0.7330\n",
      "7/15, train_loss: 0.7263\n",
      "8/15, train_loss: 0.7266\n",
      "9/15, train_loss: 0.7342\n",
      "10/15, train_loss: 0.7254\n",
      "11/15, train_loss: 0.7266\n",
      "12/15, train_loss: 0.7426\n",
      "13/15, train_loss: 0.7184\n",
      "14/15, train_loss: 0.7151\n",
      "15/15, train_loss: 0.7247\n",
      "epoch 25 average loss: 0.7260\n",
      "saved new best metric model at the 25th epoch\n",
      "current epoch: 25 current mean dice: 0.0692 \n",
      "best mean dice: 0.0692  at epoch: 25\n",
      "----------\n",
      "epoch 26/600\n",
      "1/15, train_loss: 0.7327\n",
      "2/15, train_loss: 0.7178\n",
      "3/15, train_loss: 0.7227\n",
      "4/15, train_loss: 0.7209\n",
      "5/15, train_loss: 0.7450\n",
      "6/15, train_loss: 0.7218\n",
      "7/15, train_loss: 0.7400\n",
      "8/15, train_loss: 0.7162\n",
      "9/15, train_loss: 0.7276\n",
      "10/15, train_loss: 0.7194\n",
      "11/15, train_loss: 0.7146\n",
      "12/15, train_loss: 0.7178\n",
      "13/15, train_loss: 0.7239\n",
      "14/15, train_loss: 0.7232\n",
      "15/15, train_loss: 0.7246\n",
      "epoch 26 average loss: 0.7245\n",
      "----------\n",
      "epoch 27/600\n",
      "1/15, train_loss: 0.7110\n",
      "2/15, train_loss: 0.7238\n",
      "3/15, train_loss: 0.7093\n",
      "4/15, train_loss: 0.7249\n",
      "5/15, train_loss: 0.7392\n",
      "6/15, train_loss: 0.7189\n",
      "7/15, train_loss: 0.7361\n",
      "8/15, train_loss: 0.7125\n",
      "9/15, train_loss: 0.7128\n",
      "10/15, train_loss: 0.7300\n",
      "11/15, train_loss: 0.7176\n",
      "12/15, train_loss: 0.7195\n",
      "13/15, train_loss: 0.7061\n",
      "14/15, train_loss: 0.7205\n",
      "15/15, train_loss: 0.7223\n",
      "epoch 27 average loss: 0.7203\n",
      "----------\n",
      "epoch 28/600\n",
      "1/15, train_loss: 0.7248\n",
      "2/15, train_loss: 0.7085\n",
      "3/15, train_loss: 0.7169\n",
      "4/15, train_loss: 0.7198\n",
      "5/15, train_loss: 0.7229\n",
      "6/15, train_loss: 0.7291\n",
      "7/15, train_loss: 0.7104\n",
      "8/15, train_loss: 0.7074\n",
      "9/15, train_loss: 0.7073\n",
      "10/15, train_loss: 0.7164\n",
      "11/15, train_loss: 0.7277\n",
      "12/15, train_loss: 0.7165\n",
      "13/15, train_loss: 0.7176\n",
      "14/15, train_loss: 0.7326\n",
      "15/15, train_loss: 0.7174\n",
      "epoch 28 average loss: 0.7184\n",
      "----------\n",
      "epoch 29/600\n",
      "1/15, train_loss: 0.7277\n",
      "2/15, train_loss: 0.7305\n",
      "3/15, train_loss: 0.7069\n",
      "4/15, train_loss: 0.7037\n",
      "5/15, train_loss: 0.7075\n",
      "6/15, train_loss: 0.7214\n",
      "7/15, train_loss: 0.7113\n",
      "8/15, train_loss: 0.7322\n",
      "9/15, train_loss: 0.7249\n",
      "10/15, train_loss: 0.7024\n",
      "11/15, train_loss: 0.7079\n",
      "12/15, train_loss: 0.7171\n",
      "13/15, train_loss: 0.7072\n",
      "14/15, train_loss: 0.7039\n",
      "15/15, train_loss: 0.7175\n",
      "epoch 29 average loss: 0.7148\n",
      "----------\n",
      "epoch 30/600\n",
      "1/15, train_loss: 0.7397\n",
      "2/15, train_loss: 0.7127\n",
      "3/15, train_loss: 0.7133\n",
      "4/15, train_loss: 0.7036\n",
      "5/15, train_loss: 0.7000\n",
      "6/15, train_loss: 0.7124\n",
      "7/15, train_loss: 0.7134\n",
      "8/15, train_loss: 0.7079\n",
      "9/15, train_loss: 0.7008\n",
      "10/15, train_loss: 0.7020\n",
      "11/15, train_loss: 0.6963\n",
      "12/15, train_loss: 0.7182\n",
      "13/15, train_loss: 0.7118\n",
      "14/15, train_loss: 0.6945\n",
      "15/15, train_loss: 0.7082\n",
      "epoch 30 average loss: 0.7090\n",
      "saved new best metric model at the 30th epoch\n",
      "current epoch: 30 current mean dice: 0.0866 \n",
      "best mean dice: 0.0866  at epoch: 30\n",
      "----------\n",
      "epoch 31/600\n",
      "1/15, train_loss: 0.6979\n",
      "2/15, train_loss: 0.6953\n",
      "3/15, train_loss: 0.7142\n",
      "4/15, train_loss: 0.7160\n",
      "5/15, train_loss: 0.7076\n",
      "6/15, train_loss: 0.6905\n",
      "7/15, train_loss: 0.7082\n",
      "8/15, train_loss: 0.7246\n",
      "9/15, train_loss: 0.6974\n",
      "10/15, train_loss: 0.7185\n",
      "11/15, train_loss: 0.6983\n",
      "12/15, train_loss: 0.6892\n",
      "13/15, train_loss: 0.6864\n",
      "14/15, train_loss: 0.7073\n",
      "15/15, train_loss: 0.6809\n",
      "epoch 31 average loss: 0.7022\n",
      "----------\n",
      "epoch 32/600\n",
      "1/15, train_loss: 0.7036\n",
      "2/15, train_loss: 0.6990\n",
      "3/15, train_loss: 0.6980\n",
      "4/15, train_loss: 0.6930\n",
      "5/15, train_loss: 0.6931\n",
      "6/15, train_loss: 0.7080\n",
      "7/15, train_loss: 0.7055\n",
      "8/15, train_loss: 0.7021\n",
      "9/15, train_loss: 0.6850\n",
      "10/15, train_loss: 0.7178\n",
      "11/15, train_loss: 0.6856\n",
      "12/15, train_loss: 0.7061\n",
      "13/15, train_loss: 0.7028\n",
      "14/15, train_loss: 0.7289\n",
      "15/15, train_loss: 0.6993\n",
      "epoch 32 average loss: 0.7018\n",
      "----------\n",
      "epoch 33/600\n",
      "1/15, train_loss: 0.6905\n",
      "2/15, train_loss: 0.6860\n",
      "3/15, train_loss: 0.6884\n",
      "4/15, train_loss: 0.6877\n",
      "5/15, train_loss: 0.7007\n",
      "6/15, train_loss: 0.7009\n",
      "7/15, train_loss: 0.6792\n",
      "8/15, train_loss: 0.6907\n",
      "9/15, train_loss: 0.6968\n",
      "10/15, train_loss: 0.6940\n",
      "11/15, train_loss: 0.7077\n",
      "12/15, train_loss: 0.6887\n",
      "13/15, train_loss: 0.7033\n",
      "14/15, train_loss: 0.6988\n",
      "15/15, train_loss: 0.7137\n",
      "epoch 33 average loss: 0.6951\n",
      "----------\n",
      "epoch 34/600\n",
      "1/15, train_loss: 0.6763\n",
      "2/15, train_loss: 0.6882\n",
      "3/15, train_loss: 0.6851\n",
      "4/15, train_loss: 0.6897\n",
      "5/15, train_loss: 0.7288\n",
      "6/15, train_loss: 0.6838\n",
      "7/15, train_loss: 0.6811\n",
      "8/15, train_loss: 0.6928\n",
      "9/15, train_loss: 0.7020\n",
      "10/15, train_loss: 0.6894\n",
      "11/15, train_loss: 0.6721\n",
      "12/15, train_loss: 0.7062\n",
      "13/15, train_loss: 0.6775\n",
      "14/15, train_loss: 0.6986\n",
      "15/15, train_loss: 0.6898\n",
      "epoch 34 average loss: 0.6908\n",
      "----------\n",
      "epoch 35/600\n",
      "1/15, train_loss: 0.6807\n",
      "2/15, train_loss: 0.7272\n",
      "3/15, train_loss: 0.6773\n",
      "4/15, train_loss: 0.6839\n",
      "5/15, train_loss: 0.6873\n",
      "6/15, train_loss: 0.7007\n",
      "7/15, train_loss: 0.6743\n",
      "8/15, train_loss: 0.7035\n",
      "9/15, train_loss: 0.6771\n",
      "10/15, train_loss: 0.6912\n",
      "11/15, train_loss: 0.6746\n",
      "12/15, train_loss: 0.6922\n",
      "13/15, train_loss: 0.6823\n",
      "14/15, train_loss: 0.6643\n",
      "15/15, train_loss: 0.6909\n",
      "epoch 35 average loss: 0.6872\n",
      "saved new best metric model at the 35th epoch\n",
      "current epoch: 35 current mean dice: 0.2630 \n",
      "best mean dice: 0.2630  at epoch: 35\n",
      "----------\n",
      "epoch 36/600\n",
      "1/15, train_loss: 0.7058\n",
      "2/15, train_loss: 0.6732\n",
      "3/15, train_loss: 0.6836\n",
      "4/15, train_loss: 0.6723\n",
      "5/15, train_loss: 0.6766\n",
      "6/15, train_loss: 0.6834\n",
      "7/15, train_loss: 0.6800\n",
      "8/15, train_loss: 0.6792\n",
      "9/15, train_loss: 0.6736\n",
      "10/15, train_loss: 0.6883\n",
      "11/15, train_loss: 0.6876\n",
      "12/15, train_loss: 0.6825\n",
      "13/15, train_loss: 0.6810\n",
      "14/15, train_loss: 0.6696\n",
      "15/15, train_loss: 0.6712\n",
      "epoch 36 average loss: 0.6805\n",
      "----------\n",
      "epoch 37/600\n",
      "1/15, train_loss: 0.6738\n",
      "2/15, train_loss: 0.6766\n",
      "3/15, train_loss: 0.6584\n",
      "4/15, train_loss: 0.6658\n",
      "5/15, train_loss: 0.6718\n",
      "6/15, train_loss: 0.6669\n",
      "7/15, train_loss: 0.6600\n",
      "8/15, train_loss: 0.6969\n",
      "9/15, train_loss: 0.7225\n",
      "10/15, train_loss: 0.6804\n",
      "11/15, train_loss: 0.6843\n",
      "12/15, train_loss: 0.6838\n",
      "13/15, train_loss: 0.6786\n",
      "14/15, train_loss: 0.6753\n",
      "15/15, train_loss: 0.6588\n",
      "epoch 37 average loss: 0.6769\n",
      "----------\n",
      "epoch 38/600\n",
      "1/15, train_loss: 0.6755\n",
      "2/15, train_loss: 0.6837\n",
      "3/15, train_loss: 0.6827\n",
      "4/15, train_loss: 0.6736\n",
      "5/15, train_loss: 0.6482\n",
      "6/15, train_loss: 0.6734\n",
      "7/15, train_loss: 0.6766\n",
      "8/15, train_loss: 0.6440\n",
      "9/15, train_loss: 0.6691\n",
      "10/15, train_loss: 0.6882\n",
      "11/15, train_loss: 0.6552\n",
      "12/15, train_loss: 0.6587\n",
      "13/15, train_loss: 0.6669\n",
      "14/15, train_loss: 0.6931\n",
      "15/15, train_loss: 0.6729\n",
      "epoch 38 average loss: 0.6708\n",
      "----------\n",
      "epoch 39/600\n",
      "1/15, train_loss: 0.6630\n",
      "2/15, train_loss: 0.6609\n",
      "3/15, train_loss: 0.6691\n",
      "4/15, train_loss: 0.6729\n",
      "5/15, train_loss: 0.6604\n",
      "6/15, train_loss: 0.6770\n",
      "7/15, train_loss: 0.6586\n",
      "8/15, train_loss: 0.6567\n",
      "9/15, train_loss: 0.6592\n",
      "10/15, train_loss: 0.6669\n",
      "11/15, train_loss: 0.6963\n",
      "12/15, train_loss: 0.6598\n",
      "13/15, train_loss: 0.6729\n",
      "14/15, train_loss: 0.6568\n",
      "15/15, train_loss: 0.6522\n",
      "epoch 39 average loss: 0.6655\n",
      "----------\n",
      "epoch 40/600\n",
      "1/15, train_loss: 0.6533\n",
      "2/15, train_loss: 0.6969\n",
      "3/15, train_loss: 0.6691\n",
      "4/15, train_loss: 0.6875\n",
      "5/15, train_loss: 0.6801\n",
      "6/15, train_loss: 0.6640\n",
      "7/15, train_loss: 0.6679\n",
      "8/15, train_loss: 0.6642\n",
      "9/15, train_loss: 0.6391\n",
      "10/15, train_loss: 0.6544\n",
      "11/15, train_loss: 0.6613\n",
      "12/15, train_loss: 0.6385\n",
      "13/15, train_loss: 0.6389\n",
      "14/15, train_loss: 0.6434\n",
      "15/15, train_loss: 0.6493\n",
      "epoch 40 average loss: 0.6605\n",
      "saved new best metric model at the 40th epoch\n",
      "current epoch: 40 current mean dice: 0.3403 \n",
      "best mean dice: 0.3403  at epoch: 40\n",
      "----------\n",
      "epoch 41/600\n",
      "1/15, train_loss: 0.6578\n",
      "2/15, train_loss: 0.6534\n",
      "3/15, train_loss: 0.6337\n",
      "4/15, train_loss: 0.6641\n",
      "5/15, train_loss: 0.6412\n",
      "6/15, train_loss: 0.6826\n",
      "7/15, train_loss: 0.6590\n",
      "8/15, train_loss: 0.6412\n",
      "9/15, train_loss: 0.6744\n",
      "10/15, train_loss: 0.6612\n",
      "11/15, train_loss: 0.6542\n",
      "12/15, train_loss: 0.6640\n",
      "13/15, train_loss: 0.6353\n",
      "14/15, train_loss: 0.6560\n",
      "15/15, train_loss: 0.6338\n",
      "epoch 41 average loss: 0.6541\n",
      "----------\n",
      "epoch 42/600\n",
      "1/15, train_loss: 0.6765\n",
      "2/15, train_loss: 0.6287\n",
      "3/15, train_loss: 0.6474\n",
      "4/15, train_loss: 0.6530\n",
      "5/15, train_loss: 0.6260\n",
      "6/15, train_loss: 0.6491\n",
      "7/15, train_loss: 0.6560\n",
      "8/15, train_loss: 0.6429\n",
      "9/15, train_loss: 0.6352\n",
      "10/15, train_loss: 0.6539\n",
      "11/15, train_loss: 0.6480\n",
      "12/15, train_loss: 0.6431\n",
      "13/15, train_loss: 0.6583\n",
      "14/15, train_loss: 0.6419\n",
      "15/15, train_loss: 0.6332\n",
      "epoch 42 average loss: 0.6462\n",
      "----------\n",
      "epoch 43/600\n",
      "1/15, train_loss: 0.6226\n",
      "2/15, train_loss: 0.6349\n",
      "3/15, train_loss: 0.6232\n",
      "4/15, train_loss: 0.6437\n",
      "5/15, train_loss: 0.6265\n",
      "6/15, train_loss: 0.6644\n",
      "7/15, train_loss: 0.6418\n",
      "8/15, train_loss: 0.6503\n",
      "9/15, train_loss: 0.6383\n",
      "10/15, train_loss: 0.6396\n",
      "11/15, train_loss: 0.6745\n",
      "12/15, train_loss: 0.6531\n",
      "13/15, train_loss: 0.6708\n",
      "14/15, train_loss: 0.6260\n",
      "15/15, train_loss: 0.6270\n",
      "epoch 43 average loss: 0.6425\n",
      "----------\n",
      "epoch 44/600\n",
      "1/15, train_loss: 0.6440\n",
      "2/15, train_loss: 0.6177\n",
      "3/15, train_loss: 0.6414\n",
      "4/15, train_loss: 0.6362\n",
      "5/15, train_loss: 0.6443\n",
      "6/15, train_loss: 0.6119\n",
      "7/15, train_loss: 0.6492\n",
      "8/15, train_loss: 0.6460\n",
      "9/15, train_loss: 0.6372\n",
      "10/15, train_loss: 0.6342\n",
      "11/15, train_loss: 0.6202\n",
      "12/15, train_loss: 0.6671\n",
      "13/15, train_loss: 0.6211\n",
      "14/15, train_loss: 0.6367\n",
      "15/15, train_loss: 0.6301\n",
      "epoch 44 average loss: 0.6358\n",
      "----------\n",
      "epoch 45/600\n",
      "1/15, train_loss: 0.6100\n",
      "2/15, train_loss: 0.6217\n",
      "3/15, train_loss: 0.6132\n",
      "4/15, train_loss: 0.5992\n",
      "5/15, train_loss: 0.6246\n",
      "6/15, train_loss: 0.6298\n",
      "7/15, train_loss: 0.6179\n",
      "8/15, train_loss: 0.6061\n",
      "9/15, train_loss: 0.6394\n",
      "10/15, train_loss: 0.6234\n",
      "11/15, train_loss: 0.6662\n",
      "12/15, train_loss: 0.6308\n",
      "13/15, train_loss: 0.5991\n",
      "14/15, train_loss: 0.6787\n",
      "15/15, train_loss: 0.6480\n",
      "epoch 45 average loss: 0.6272\n",
      "current epoch: 45 current mean dice: 0.3296 \n",
      "best mean dice: 0.3403  at epoch: 40\n",
      "----------\n",
      "epoch 46/600\n",
      "1/15, train_loss: 0.6119\n",
      "2/15, train_loss: 0.6145\n",
      "3/15, train_loss: 0.6124\n",
      "4/15, train_loss: 0.6103\n",
      "5/15, train_loss: 0.6092\n",
      "6/15, train_loss: 0.6005\n",
      "7/15, train_loss: 0.6469\n",
      "8/15, train_loss: 0.6528\n",
      "9/15, train_loss: 0.6192\n",
      "10/15, train_loss: 0.6308\n",
      "11/15, train_loss: 0.6230\n",
      "12/15, train_loss: 0.6051\n",
      "13/15, train_loss: 0.6063\n",
      "14/15, train_loss: 0.6053\n",
      "15/15, train_loss: 0.5903\n",
      "epoch 46 average loss: 0.6159\n",
      "----------\n",
      "epoch 47/600\n",
      "1/15, train_loss: 0.6119\n",
      "2/15, train_loss: 0.6169\n",
      "3/15, train_loss: 0.6250\n",
      "4/15, train_loss: 0.6426\n",
      "5/15, train_loss: 0.6003\n",
      "6/15, train_loss: 0.6189\n",
      "7/15, train_loss: 0.6360\n",
      "8/15, train_loss: 0.6145\n",
      "9/15, train_loss: 0.6089\n",
      "10/15, train_loss: 0.6036\n",
      "11/15, train_loss: 0.6064\n",
      "12/15, train_loss: 0.5931\n",
      "13/15, train_loss: 0.6294\n",
      "14/15, train_loss: 0.5906\n",
      "15/15, train_loss: 0.6102\n",
      "epoch 47 average loss: 0.6139\n",
      "----------\n",
      "epoch 48/600\n",
      "1/15, train_loss: 0.6541\n",
      "2/15, train_loss: 0.5942\n",
      "3/15, train_loss: 0.5936\n",
      "4/15, train_loss: 0.5888\n",
      "5/15, train_loss: 0.6599\n",
      "6/15, train_loss: 0.5672\n",
      "7/15, train_loss: 0.6088\n",
      "8/15, train_loss: 0.6024\n",
      "9/15, train_loss: 0.5984\n",
      "10/15, train_loss: 0.5776\n",
      "11/15, train_loss: 0.6302\n",
      "12/15, train_loss: 0.5998\n",
      "13/15, train_loss: 0.6070\n",
      "14/15, train_loss: 0.5966\n",
      "15/15, train_loss: 0.6175\n",
      "epoch 48 average loss: 0.6064\n",
      "----------\n",
      "epoch 49/600\n",
      "1/15, train_loss: 0.5891\n",
      "2/15, train_loss: 0.5863\n",
      "3/15, train_loss: 0.5921\n",
      "4/15, train_loss: 0.5865\n",
      "5/15, train_loss: 0.6101\n",
      "6/15, train_loss: 0.5954\n",
      "7/15, train_loss: 0.6139\n",
      "8/15, train_loss: 0.5965\n",
      "9/15, train_loss: 0.6520\n",
      "10/15, train_loss: 0.6286\n",
      "11/15, train_loss: 0.5805\n",
      "12/15, train_loss: 0.5854\n",
      "13/15, train_loss: 0.5970\n",
      "14/15, train_loss: 0.5790\n",
      "15/15, train_loss: 0.5942\n",
      "epoch 49 average loss: 0.5991\n",
      "----------\n",
      "epoch 50/600\n",
      "1/15, train_loss: 0.5641\n",
      "2/15, train_loss: 0.6022\n",
      "3/15, train_loss: 0.5692\n",
      "4/15, train_loss: 0.6056\n",
      "5/15, train_loss: 0.5621\n",
      "6/15, train_loss: 0.5590\n",
      "7/15, train_loss: 0.5934\n",
      "8/15, train_loss: 0.6014\n",
      "9/15, train_loss: 0.5574\n",
      "10/15, train_loss: 0.6255\n",
      "11/15, train_loss: 0.6202\n",
      "12/15, train_loss: 0.5640\n",
      "13/15, train_loss: 0.6037\n",
      "14/15, train_loss: 0.5879\n",
      "15/15, train_loss: 0.5927\n",
      "epoch 50 average loss: 0.5872\n",
      "saved new best metric model at the 50th epoch\n",
      "current epoch: 50 current mean dice: 0.3460 \n",
      "best mean dice: 0.3460  at epoch: 50\n",
      "----------\n",
      "epoch 51/600\n",
      "1/15, train_loss: 0.5975\n",
      "2/15, train_loss: 0.5961\n",
      "3/15, train_loss: 0.5928\n",
      "4/15, train_loss: 0.6370\n",
      "5/15, train_loss: 0.5694\n",
      "6/15, train_loss: 0.5734\n",
      "7/15, train_loss: 0.5822\n",
      "8/15, train_loss: 0.5736\n",
      "9/15, train_loss: 0.5849\n",
      "10/15, train_loss: 0.5907\n",
      "11/15, train_loss: 0.5837\n",
      "12/15, train_loss: 0.5657\n",
      "13/15, train_loss: 0.5521\n",
      "14/15, train_loss: 0.5505\n",
      "15/15, train_loss: 0.6236\n",
      "epoch 51 average loss: 0.5849\n",
      "----------\n",
      "epoch 52/600\n",
      "1/15, train_loss: 0.5853\n",
      "2/15, train_loss: 0.5770\n",
      "3/15, train_loss: 0.5870\n",
      "4/15, train_loss: 0.5637\n",
      "5/15, train_loss: 0.5532\n",
      "6/15, train_loss: 0.5546\n",
      "7/15, train_loss: 0.6103\n",
      "8/15, train_loss: 0.5712\n",
      "9/15, train_loss: 0.5717\n",
      "10/15, train_loss: 0.5728\n",
      "11/15, train_loss: 0.6213\n",
      "12/15, train_loss: 0.5691\n",
      "13/15, train_loss: 0.5623\n",
      "14/15, train_loss: 0.5549\n",
      "15/15, train_loss: 0.6047\n",
      "epoch 52 average loss: 0.5773\n",
      "----------\n",
      "epoch 53/600\n",
      "1/15, train_loss: 0.6140\n",
      "2/15, train_loss: 0.6276\n",
      "3/15, train_loss: 0.5554\n",
      "4/15, train_loss: 0.5484\n",
      "5/15, train_loss: 0.5878\n",
      "6/15, train_loss: 0.6203\n",
      "7/15, train_loss: 0.5920\n",
      "8/15, train_loss: 0.5466\n",
      "9/15, train_loss: 0.5647\n",
      "10/15, train_loss: 0.5663\n",
      "11/15, train_loss: 0.5729\n",
      "12/15, train_loss: 0.5899\n",
      "13/15, train_loss: 0.5557\n",
      "14/15, train_loss: 0.5559\n",
      "15/15, train_loss: 0.5944\n",
      "epoch 53 average loss: 0.5795\n",
      "----------\n",
      "epoch 54/600\n",
      "1/15, train_loss: 0.5726\n",
      "2/15, train_loss: 0.5421\n",
      "3/15, train_loss: 0.5870\n",
      "4/15, train_loss: 0.6135\n",
      "5/15, train_loss: 0.5598\n",
      "6/15, train_loss: 0.5397\n",
      "7/15, train_loss: 0.6009\n",
      "8/15, train_loss: 0.5598\n",
      "9/15, train_loss: 0.5344\n",
      "10/15, train_loss: 0.5242\n",
      "11/15, train_loss: 0.5802\n",
      "12/15, train_loss: 0.5765\n",
      "13/15, train_loss: 0.5817\n",
      "14/15, train_loss: 0.5736\n",
      "15/15, train_loss: 0.5440\n",
      "epoch 54 average loss: 0.5660\n",
      "----------\n",
      "epoch 55/600\n",
      "1/15, train_loss: 0.5428\n",
      "2/15, train_loss: 0.5313\n",
      "3/15, train_loss: 0.5903\n",
      "4/15, train_loss: 0.5729\n",
      "5/15, train_loss: 0.6247\n",
      "6/15, train_loss: 0.5494\n",
      "7/15, train_loss: 0.5747\n",
      "8/15, train_loss: 0.5650\n",
      "9/15, train_loss: 0.5551\n",
      "10/15, train_loss: 0.5562\n",
      "11/15, train_loss: 0.5306\n",
      "12/15, train_loss: 0.5492\n",
      "13/15, train_loss: 0.5334\n",
      "14/15, train_loss: 0.6187\n",
      "15/15, train_loss: 0.5379\n",
      "epoch 55 average loss: 0.5621\n",
      "15/15, train_loss: 0.5365\n",
      "epoch 57 average loss: 0.5537\n",
      "----------\n",
      "epoch 58/600\n",
      "1/15, train_loss: 0.5309\n",
      "2/15, train_loss: 0.5032\n",
      "3/15, train_loss: 0.5100\n",
      "4/15, train_loss: 0.6088\n",
      "5/15, train_loss: 0.5188\n",
      "6/15, train_loss: 0.5392\n",
      "7/15, train_loss: 0.5926\n",
      "8/15, train_loss: 0.5613\n",
      "9/15, train_loss: 0.5580\n",
      "10/15, train_loss: 0.5478\n",
      "11/15, train_loss: 0.5464\n",
      "12/15, train_loss: 0.5275\n",
      "13/15, train_loss: 0.5513\n",
      "14/15, train_loss: 0.5286\n",
      "15/15, train_loss: 0.5339\n",
      "epoch 58 average loss: 0.5439\n",
      "----------\n",
      "epoch 59/600\n",
      "1/15, train_loss: 0.5292\n",
      "2/15, train_loss: 0.5601\n",
      "3/15, train_loss: 0.5095\n",
      "4/15, train_loss: 0.5272\n",
      "5/15, train_loss: 0.5252\n",
      "6/15, train_loss: 0.5937\n",
      "7/15, train_loss: 0.5286\n",
      "8/15, train_loss: 0.5480\n",
      "9/15, train_loss: 0.5357\n",
      "10/15, train_loss: 0.5592\n",
      "11/15, train_loss: 0.5095\n",
      "12/15, train_loss: 0.5504\n",
      "13/15, train_loss: 0.5940\n",
      "14/15, train_loss: 0.5215\n",
      "15/15, train_loss: 0.5588\n",
      "epoch 59 average loss: 0.5434\n",
      "----------\n",
      "epoch 60/600\n",
      "1/15, train_loss: 0.5254\n",
      "2/15, train_loss: 0.5482\n",
      "3/15, train_loss: 0.5836\n",
      "4/15, train_loss: 0.5241\n",
      "5/15, train_loss: 0.5389\n",
      "6/15, train_loss: 0.5350\n",
      "7/15, train_loss: 0.5242\n",
      "8/15, train_loss: 0.5245\n",
      "9/15, train_loss: 0.5286\n",
      "10/15, train_loss: 0.5888\n",
      "11/15, train_loss: 0.5288\n",
      "12/15, train_loss: 0.4996\n",
      "13/15, train_loss: 0.4994\n",
      "14/15, train_loss: 0.6051\n",
      "15/15, train_loss: 0.5275\n",
      "epoch 60 average loss: 0.5388\n",
      "saved new best metric model at the 60th epoch\n",
      "current epoch: 60 current mean dice: 0.3991 \n",
      "best mean dice: 0.3991  at epoch: 60\n",
      "----------\n",
      "epoch 61/600\n",
      "1/15, train_loss: 0.6513\n",
      "2/15, train_loss: 0.4991\n",
      "3/15, train_loss: 0.5620\n",
      "4/15, train_loss: 0.5345\n",
      "5/15, train_loss: 0.5222\n",
      "6/15, train_loss: 0.5824\n",
      "7/15, train_loss: 0.5283\n",
      "8/15, train_loss: 0.4946\n",
      "9/15, train_loss: 0.5508\n",
      "10/15, train_loss: 0.5277\n",
      "11/15, train_loss: 0.4841\n",
      "12/15, train_loss: 0.5092\n",
      "13/15, train_loss: 0.5221\n",
      "14/15, train_loss: 0.4864\n",
      "15/15, train_loss: 0.5073\n",
      "epoch 61 average loss: 0.5308\n",
      "----------\n",
      "epoch 62/600\n",
      "1/15, train_loss: 0.5056\n",
      "2/15, train_loss: 0.5155\n",
      "3/15, train_loss: 0.5064\n",
      "4/15, train_loss: 0.5212\n",
      "5/15, train_loss: 0.5394\n",
      "6/15, train_loss: 0.5692\n",
      "7/15, train_loss: 0.5179\n",
      "8/15, train_loss: 0.4989\n",
      "9/15, train_loss: 0.5151\n",
      "10/15, train_loss: 0.4931\n",
      "11/15, train_loss: 0.5728\n",
      "12/15, train_loss: 0.5384\n",
      "13/15, train_loss: 0.6278\n",
      "14/15, train_loss: 0.5314\n",
      "15/15, train_loss: 0.5402\n",
      "epoch 62 average loss: 0.5329\n",
      "----------\n",
      "epoch 63/600\n",
      "1/15, train_loss: 0.5286\n",
      "2/15, train_loss: 0.5120\n",
      "3/15, train_loss: 0.5476\n",
      "4/15, train_loss: 0.5827\n",
      "5/15, train_loss: 0.5121\n",
      "6/15, train_loss: 0.5650\n",
      "7/15, train_loss: 0.4895\n",
      "8/15, train_loss: 0.4977\n",
      "9/15, train_loss: 0.5084\n",
      "10/15, train_loss: 0.5121\n",
      "11/15, train_loss: 0.5484\n",
      "12/15, train_loss: 0.5575\n",
      "13/15, train_loss: 0.5056\n",
      "14/15, train_loss: 0.4872\n",
      "15/15, train_loss: 0.5486\n",
      "epoch 63 average loss: 0.5269\n",
      "----------\n",
      "epoch 64/600\n",
      "1/15, train_loss: 0.4974\n",
      "2/15, train_loss: 0.6013\n",
      "3/15, train_loss: 0.4961\n",
      "4/15, train_loss: 0.4922\n",
      "5/15, train_loss: 0.5126\n",
      "6/15, train_loss: 0.5019\n",
      "7/15, train_loss: 0.5701\n",
      "8/15, train_loss: 0.4776\n",
      "9/15, train_loss: 0.5451\n",
      "10/15, train_loss: 0.4843\n",
      "11/15, train_loss: 0.4985\n",
      "12/15, train_loss: 0.5387\n",
      "13/15, train_loss: 0.5334\n",
      "14/15, train_loss: 0.4988\n",
      "15/15, train_loss: 0.5451\n",
      "epoch 64 average loss: 0.5195\n",
      "----------\n",
      "epoch 65/600\n",
      "1/15, train_loss: 0.4880\n",
      "2/15, train_loss: 0.5216\n",
      "3/15, train_loss: 0.4990\n",
      "4/15, train_loss: 0.5084\n",
      "5/15, train_loss: 0.4847\n",
      "6/15, train_loss: 0.4912\n",
      "7/15, train_loss: 0.5721\n",
      "8/15, train_loss: 0.4950\n",
      "9/15, train_loss: 0.4980\n",
      "10/15, train_loss: 0.4919\n",
      "11/15, train_loss: 0.5297\n",
      "12/15, train_loss: 0.5029\n",
      "13/15, train_loss: 0.5085\n",
      "14/15, train_loss: 0.5393\n",
      "15/15, train_loss: 0.4881\n",
      "epoch 65 average loss: 0.5079\n",
      "saved new best metric model at the 65th epoch\n",
      "current epoch: 65 current mean dice: 0.4294 \n",
      "best mean dice: 0.4294  at epoch: 65\n",
      "----------\n",
      "epoch 66/600\n",
      "1/15, train_loss: 0.4990\n",
      "2/15, train_loss: 0.5337\n",
      "3/15, train_loss: 0.5219\n",
      "4/15, train_loss: 0.4866\n",
      "5/15, train_loss: 0.4828\n",
      "6/15, train_loss: 0.6318\n",
      "7/15, train_loss: 0.5512\n",
      "8/15, train_loss: 0.4769\n",
      "9/15, train_loss: 0.4919\n",
      "10/15, train_loss: 0.4636\n",
      "11/15, train_loss: 0.4977\n",
      "12/15, train_loss: 0.4754\n",
      "13/15, train_loss: 0.5479\n",
      "14/15, train_loss: 0.5331\n",
      "15/15, train_loss: 0.4871\n",
      "epoch 66 average loss: 0.5120\n",
      "----------\n",
      "epoch 67/600\n",
      "1/15, train_loss: 0.5298\n",
      "2/15, train_loss: 0.4977\n",
      "3/15, train_loss: 0.4861\n",
      "4/15, train_loss: 0.5000\n",
      "5/15, train_loss: 0.5181\n",
      "6/15, train_loss: 0.5714\n",
      "7/15, train_loss: 0.5564\n",
      "8/15, train_loss: 0.5068\n",
      "9/15, train_loss: 0.4830\n",
      "10/15, train_loss: 0.5068\n",
      "11/15, train_loss: 0.5267\n",
      "12/15, train_loss: 0.4942\n",
      "13/15, train_loss: 0.5064\n",
      "14/15, train_loss: 0.4917\n",
      "15/15, train_loss: 0.5106\n",
      "epoch 67 average loss: 0.5124\n",
      "----------\n",
      "epoch 68/600\n",
      "1/15, train_loss: 0.5655\n",
      "2/15, train_loss: 0.5022\n",
      "3/15, train_loss: 0.4894\n",
      "4/15, train_loss: 0.4943\n",
      "5/15, train_loss: 0.5016\n",
      "6/15, train_loss: 0.5141\n",
      "7/15, train_loss: 0.5060\n",
      "8/15, train_loss: 0.5697\n",
      "9/15, train_loss: 0.5147\n",
      "10/15, train_loss: 0.4640\n",
      "11/15, train_loss: 0.4766\n",
      "12/15, train_loss: 0.5076\n",
      "13/15, train_loss: 0.5195\n",
      "14/15, train_loss: 0.4855\n",
      "15/15, train_loss: 0.5104\n",
      "epoch 68 average loss: 0.5081\n",
      "----------\n",
      "epoch 69/600\n",
      "1/15, train_loss: 0.4923\n",
      "2/15, train_loss: 0.5266\n",
      "3/15, train_loss: 0.4893\n",
      "4/15, train_loss: 0.4890\n",
      "5/15, train_loss: 0.4979\n",
      "6/15, train_loss: 0.5510\n",
      "7/15, train_loss: 0.4647\n",
      "8/15, train_loss: 0.4824\n",
      "9/15, train_loss: 0.4859\n",
      "10/15, train_loss: 0.4876\n",
      "11/15, train_loss: 0.5520\n",
      "12/15, train_loss: 0.4824\n",
      "13/15, train_loss: 0.4981\n",
      "14/15, train_loss: 0.5608\n",
      "15/15, train_loss: 0.4836\n",
      "epoch 69 average loss: 0.5029\n",
      "----------\n",
      "epoch 70/600\n",
      "1/15, train_loss: 0.5078\n",
      "2/15, train_loss: 0.4775\n",
      "3/15, train_loss: 0.5021\n",
      "4/15, train_loss: 0.5081\n",
      "5/15, train_loss: 0.5717\n",
      "6/15, train_loss: 0.5315\n",
      "7/15, train_loss: 0.4925\n",
      "8/15, train_loss: 0.4615\n",
      "9/15, train_loss: 0.4815\n",
      "10/15, train_loss: 0.4651\n",
      "11/15, train_loss: 0.5620\n",
      "12/15, train_loss: 0.5024\n",
      "13/15, train_loss: 0.4549\n",
      "14/15, train_loss: 0.4930\n",
      "15/15, train_loss: 0.5058\n",
      "epoch 70 average loss: 0.5012\n",
      "current epoch: 70 current mean dice: 0.4130 \n",
      "best mean dice: 0.4294  at epoch: 65\n",
      "----------\n",
      "epoch 71/600\n",
      "1/15, train_loss: 0.4999\n",
      "2/15, train_loss: 0.4525\n",
      "3/15, train_loss: 0.4707\n",
      "4/15, train_loss: 0.5197\n",
      "5/15, train_loss: 0.5282\n",
      "6/15, train_loss: 0.4871\n",
      "7/15, train_loss: 0.5100\n",
      "8/15, train_loss: 0.4429\n",
      "9/15, train_loss: 0.5122\n",
      "10/15, train_loss: 0.5032\n",
      "11/15, train_loss: 0.4897\n",
      "12/15, train_loss: 0.4959\n",
      "13/15, train_loss: 0.4671\n",
      "14/15, train_loss: 0.5818\n",
      "15/15, train_loss: 0.5475\n",
      "epoch 71 average loss: 0.5006\n",
      "----------\n",
      "epoch 72/600\n",
      "1/15, train_loss: 0.5148\n",
      "2/15, train_loss: 0.4739\n",
      "3/15, train_loss: 0.4805\n",
      "4/15, train_loss: 0.5114\n",
      "5/15, train_loss: 0.4474\n",
      "6/15, train_loss: 0.4722\n",
      "7/15, train_loss: 0.4835\n",
      "8/15, train_loss: 0.4895\n",
      "9/15, train_loss: 0.5558\n",
      "10/15, train_loss: 0.4824\n",
      "11/15, train_loss: 0.4480\n",
      "12/15, train_loss: 0.5056\n",
      "13/15, train_loss: 0.4729\n",
      "14/15, train_loss: 0.5848\n",
      "15/15, train_loss: 0.4790\n",
      "epoch 72 average loss: 0.4934\n",
      "----------\n",
      "epoch 73/600\n",
      "1/15, train_loss: 0.5417\n",
      "2/15, train_loss: 0.4674\n",
      "3/15, train_loss: 0.5201\n",
      "4/15, train_loss: 0.4754\n",
      "5/15, train_loss: 0.5119\n",
      "6/15, train_loss: 0.4878\n",
      "7/15, train_loss: 0.4729\n",
      "8/15, train_loss: 0.4919\n",
      "9/15, train_loss: 0.4844\n",
      "10/15, train_loss: 0.4774\n",
      "11/15, train_loss: 0.4601\n",
      "12/15, train_loss: 0.5589\n",
      "13/15, train_loss: 0.4963\n",
      "14/15, train_loss: 0.4460\n",
      "15/15, train_loss: 0.4755\n",
      "epoch 73 average loss: 0.4912\n",
      "----------\n",
      "epoch 74/600\n",
      "1/15, train_loss: 0.4762\n",
      "2/15, train_loss: 0.4819\n",
      "3/15, train_loss: 0.4546\n",
      "4/15, train_loss: 0.4689\n",
      "5/15, train_loss: 0.4639\n",
      "6/15, train_loss: 0.5210\n",
      "7/15, train_loss: 0.5456\n",
      "8/15, train_loss: 0.4460\n",
      "9/15, train_loss: 0.4507\n",
      "10/15, train_loss: 0.5060\n",
      "11/15, train_loss: 0.5033\n",
      "12/15, train_loss: 0.4889\n",
      "13/15, train_loss: 0.4673\n",
      "14/15, train_loss: 0.4812\n",
      "15/15, train_loss: 0.5323\n",
      "epoch 74 average loss: 0.4859\n",
      "----------\n",
      "epoch 75/600\n",
      "1/15, train_loss: 0.4857\n",
      "2/15, train_loss: 0.5116\n",
      "3/15, train_loss: 0.4903\n",
      "4/15, train_loss: 0.4726\n",
      "5/15, train_loss: 0.4896\n",
      "6/15, train_loss: 0.4472\n",
      "7/15, train_loss: 0.4668\n",
      "8/15, train_loss: 0.4931\n",
      "9/15, train_loss: 0.4799\n",
      "10/15, train_loss: 0.4830\n",
      "11/15, train_loss: 0.5473\n",
      "12/15, train_loss: 0.4474\n",
      "13/15, train_loss: 0.4619\n",
      "14/15, train_loss: 0.5340\n",
      "15/15, train_loss: 0.4780\n",
      "epoch 75 average loss: 0.4859\n",
      "current epoch: 75 current mean dice: 0.4015 \n",
      "best mean dice: 0.4294  at epoch: 65\n",
      "----------\n",
      "epoch 76/600\n",
      "1/15, train_loss: 0.4691\n",
      "2/15, train_loss: 0.5239\n",
      "3/15, train_loss: 0.4928\n",
      "4/15, train_loss: 0.4571\n",
      "5/15, train_loss: 0.4457\n",
      "6/15, train_loss: 0.5056\n",
      "7/15, train_loss: 0.4725\n",
      "8/15, train_loss: 0.4342\n",
      "9/15, train_loss: 0.5110\n",
      "10/15, train_loss: 0.5263\n",
      "11/15, train_loss: 0.4550\n",
      "12/15, train_loss: 0.4880\n",
      "13/15, train_loss: 0.4835\n",
      "14/15, train_loss: 0.4518\n",
      "15/15, train_loss: 0.4795\n",
      "epoch 76 average loss: 0.4797\n",
      "----------\n",
      "epoch 77/600\n",
      "1/15, train_loss: 0.4789\n",
      "2/15, train_loss: 0.4573\n",
      "3/15, train_loss: 0.4745\n",
      "4/15, train_loss: 0.4761\n",
      "5/15, train_loss: 0.4447\n",
      "6/15, train_loss: 0.4721\n",
      "7/15, train_loss: 0.5185\n",
      "8/15, train_loss: 0.4841\n",
      "9/15, train_loss: 0.5146\n",
      "10/15, train_loss: 0.4681\n",
      "11/15, train_loss: 0.4638\n",
      "12/15, train_loss: 0.4780\n",
      "13/15, train_loss: 0.4623\n",
      "14/15, train_loss: 0.4512\n",
      "15/15, train_loss: 0.5306\n",
      "epoch 77 average loss: 0.4783\n",
      "----------\n",
      "epoch 78/600\n",
      "1/15, train_loss: 0.5083\n",
      "2/15, train_loss: 0.4594\n",
      "3/15, train_loss: 0.5005\n",
      "4/15, train_loss: 0.4490\n",
      "5/15, train_loss: 0.5184\n",
      "6/15, train_loss: 0.4480\n",
      "7/15, train_loss: 0.4332\n",
      "8/15, train_loss: 0.4642\n",
      "9/15, train_loss: 0.4656\n",
      "10/15, train_loss: 0.4711\n",
      "11/15, train_loss: 0.4397\n",
      "12/15, train_loss: 0.4453\n",
      "13/15, train_loss: 0.5454\n",
      "14/15, train_loss: 0.4691\n",
      "15/15, train_loss: 0.4564\n",
      "epoch 78 average loss: 0.4716\n",
      "----------\n",
      "epoch 79/600\n",
      "1/15, train_loss: 0.4384\n",
      "2/15, train_loss: 0.4703\n",
      "3/15, train_loss: 0.4469\n",
      "4/15, train_loss: 0.4486\n",
      "5/15, train_loss: 0.4211\n",
      "6/15, train_loss: 0.4411\n",
      "7/15, train_loss: 0.5108\n",
      "8/15, train_loss: 0.4602\n",
      "9/15, train_loss: 0.4411\n",
      "10/15, train_loss: 0.4582\n",
      "11/15, train_loss: 0.4496\n",
      "12/15, train_loss: 0.4561\n",
      "13/15, train_loss: 0.5751\n",
      "14/15, train_loss: 0.4451\n",
      "15/15, train_loss: 0.5188\n",
      "epoch 79 average loss: 0.4654\n",
      "----------\n",
      "epoch 80/600\n",
      "1/15, train_loss: 0.4907\n",
      "2/15, train_loss: 0.4476\n",
      "3/15, train_loss: 0.4353\n",
      "4/15, train_loss: 0.4513\n",
      "5/15, train_loss: 0.4878\n",
      "6/15, train_loss: 0.4498\n",
      "7/15, train_loss: 0.4664\n",
      "8/15, train_loss: 0.4451\n",
      "9/15, train_loss: 0.5095\n",
      "10/15, train_loss: 0.4705\n",
      "11/15, train_loss: 0.4839\n",
      "12/15, train_loss: 0.4500\n",
      "13/15, train_loss: 0.5135\n",
      "14/15, train_loss: 0.4795\n",
      "15/15, train_loss: 0.4465\n",
      "epoch 80 average loss: 0.4685\n",
      "current epoch: 80 current mean dice: 0.4289 \n",
      "best mean dice: 0.4294  at epoch: 65\n",
      "----------\n",
      "epoch 81/600\n",
      "1/15, train_loss: 0.4667\n",
      "2/15, train_loss: 0.4482\n",
      "3/15, train_loss: 0.4740\n",
      "4/15, train_loss: 0.4450\n",
      "5/15, train_loss: 0.5490\n",
      "6/15, train_loss: 0.4474\n",
      "7/15, train_loss: 0.5380\n",
      "8/15, train_loss: 0.4592\n",
      "9/15, train_loss: 0.4697\n",
      "10/15, train_loss: 0.4563\n",
      "11/15, train_loss: 0.4380\n",
      "12/15, train_loss: 0.4693\n",
      "13/15, train_loss: 0.4740\n",
      "14/15, train_loss: 0.4522\n",
      "15/15, train_loss: 0.4829\n",
      "epoch 81 average loss: 0.4713\n",
      "----------\n",
      "epoch 82/600\n",
      "1/15, train_loss: 0.4420\n",
      "2/15, train_loss: 0.4484\n",
      "3/15, train_loss: 0.4476\n",
      "4/15, train_loss: 0.5089\n",
      "5/15, train_loss: 0.4513\n",
      "6/15, train_loss: 0.4636\n",
      "7/15, train_loss: 0.4757\n",
      "8/15, train_loss: 0.5316\n",
      "9/15, train_loss: 0.4580\n",
      "10/15, train_loss: 0.4484\n",
      "11/15, train_loss: 0.4637\n",
      "12/15, train_loss: 0.4476\n",
      "13/15, train_loss: 0.4856\n",
      "14/15, train_loss: 0.4670\n",
      "15/15, train_loss: 0.4408\n",
      "epoch 82 average loss: 0.4653\n",
      "----------\n",
      "epoch 83/600\n",
      "1/15, train_loss: 0.4256\n",
      "2/15, train_loss: 0.4636\n",
      "3/15, train_loss: 0.4722\n",
      "4/15, train_loss: 0.4164\n",
      "5/15, train_loss: 0.5120\n",
      "6/15, train_loss: 0.4367\n",
      "7/15, train_loss: 0.4493\n",
      "8/15, train_loss: 0.4778\n",
      "9/15, train_loss: 0.4780\n",
      "10/15, train_loss: 0.4153\n",
      "11/15, train_loss: 0.5504\n",
      "12/15, train_loss: 0.4772\n",
      "13/15, train_loss: 0.4480\n",
      "14/15, train_loss: 0.4605\n",
      "15/15, train_loss: 0.4808\n",
      "epoch 83 average loss: 0.4643\n",
      "----------\n",
      "epoch 84/600\n",
      "1/15, train_loss: 0.4604\n",
      "2/15, train_loss: 0.4255\n",
      "3/15, train_loss: 0.4760\n",
      "4/15, train_loss: 0.4368\n",
      "5/15, train_loss: 0.5488\n",
      "6/15, train_loss: 0.4632\n",
      "7/15, train_loss: 0.4774\n",
      "8/15, train_loss: 0.4312\n",
      "9/15, train_loss: 0.4400\n",
      "10/15, train_loss: 0.4483\n",
      "11/15, train_loss: 0.4416\n",
      "12/15, train_loss: 0.4918\n",
      "13/15, train_loss: 0.4454\n",
      "14/15, train_loss: 0.4513\n",
      "15/15, train_loss: 0.4968\n",
      "epoch 84 average loss: 0.4623\n",
      "----------\n",
      "epoch 85/600\n",
      "1/15, train_loss: 0.4489\n",
      "2/15, train_loss: 0.4386\n",
      "3/15, train_loss: 0.4417\n",
      "4/15, train_loss: 0.4407\n",
      "5/15, train_loss: 0.5317\n",
      "6/15, train_loss: 0.4404\n",
      "7/15, train_loss: 0.4374\n",
      "8/15, train_loss: 0.5192\n",
      "9/15, train_loss: 0.4455\n",
      "10/15, train_loss: 0.5321\n",
      "11/15, train_loss: 0.4239\n",
      "12/15, train_loss: 0.4592\n",
      "13/15, train_loss: 0.4492\n",
      "14/15, train_loss: 0.4643\n",
      "15/15, train_loss: 0.4377\n",
      "epoch 85 average loss: 0.4607\n",
      "current epoch: 85 current mean dice: 0.4289 \n",
      "best mean dice: 0.4294  at epoch: 65\n",
      "----------\n",
      "epoch 86/600\n",
      "1/15, train_loss: 0.4529\n",
      "2/15, train_loss: 0.4573\n",
      "3/15, train_loss: 0.5322\n",
      "4/15, train_loss: 0.4322\n",
      "5/15, train_loss: 0.5583\n",
      "6/15, train_loss: 0.4260\n",
      "7/15, train_loss: 0.4508\n",
      "8/15, train_loss: 0.4356\n",
      "9/15, train_loss: 0.4181\n",
      "10/15, train_loss: 0.4312\n",
      "11/15, train_loss: 0.4423\n",
      "12/15, train_loss: 0.4345\n",
      "13/15, train_loss: 0.4366\n",
      "14/15, train_loss: 0.4542\n",
      "15/15, train_loss: 0.4501\n",
      "epoch 86 average loss: 0.4542\n",
      "----------\n",
      "epoch 87/600\n",
      "1/15, train_loss: 0.4268\n",
      "2/15, train_loss: 0.4330\n",
      "3/15, train_loss: 0.4247\n",
      "4/15, train_loss: 0.4356\n",
      "5/15, train_loss: 0.4491\n",
      "6/15, train_loss: 0.5248\n",
      "7/15, train_loss: 0.4213\n",
      "8/15, train_loss: 0.4735\n",
      "9/15, train_loss: 0.4531\n",
      "10/15, train_loss: 0.4418\n",
      "11/15, train_loss: 0.4902\n",
      "12/15, train_loss: 0.4534\n",
      "13/15, train_loss: 0.4489\n",
      "14/15, train_loss: 0.4691\n",
      "15/15, train_loss: 0.4598\n",
      "epoch 87 average loss: 0.4537\n",
      "----------\n",
      "epoch 88/600\n",
      "1/15, train_loss: 0.5474\n",
      "2/15, train_loss: 0.4181\n",
      "3/15, train_loss: 0.4689\n",
      "4/15, train_loss: 0.4427\n",
      "5/15, train_loss: 0.4199\n",
      "6/15, train_loss: 0.4226\n",
      "7/15, train_loss: 0.4390\n",
      "8/15, train_loss: 0.4740\n",
      "9/15, train_loss: 0.4666\n",
      "10/15, train_loss: 0.4196\n",
      "11/15, train_loss: 0.4714\n",
      "12/15, train_loss: 0.4332\n",
      "13/15, train_loss: 0.5395\n",
      "14/15, train_loss: 0.4318\n",
      "15/15, train_loss: 0.4115\n",
      "epoch 88 average loss: 0.4538\n",
      "----------\n",
      "epoch 89/600\n",
      "1/15, train_loss: 0.4466\n",
      "2/15, train_loss: 0.4407\n",
      "3/15, train_loss: 0.5084\n",
      "4/15, train_loss: 0.4311\n",
      "5/15, train_loss: 0.4608\n",
      "6/15, train_loss: 0.4506\n",
      "7/15, train_loss: 0.4193\n",
      "8/15, train_loss: 0.4266\n",
      "9/15, train_loss: 0.4698\n",
      "10/15, train_loss: 0.5419\n",
      "11/15, train_loss: 0.4263\n",
      "12/15, train_loss: 0.4092\n",
      "13/15, train_loss: 0.4277\n",
      "14/15, train_loss: 0.4207\n",
      "15/15, train_loss: 0.4607\n",
      "epoch 89 average loss: 0.4493\n",
      "----------\n",
      "epoch 90/600\n",
      "1/15, train_loss: 0.4326\n",
      "2/15, train_loss: 0.4093\n",
      "3/15, train_loss: 0.4449\n",
      "4/15, train_loss: 0.5197\n",
      "5/15, train_loss: 0.4320\n",
      "6/15, train_loss: 0.4164\n",
      "7/15, train_loss: 0.5017\n",
      "8/15, train_loss: 0.4421\n",
      "9/15, train_loss: 0.4621\n",
      "10/15, train_loss: 0.4265\n",
      "11/15, train_loss: 0.4365\n",
      "12/15, train_loss: 0.5043\n",
      "13/15, train_loss: 0.4940\n",
      "14/15, train_loss: 0.4278\n",
      "15/15, train_loss: 0.4501\n",
      "epoch 90 average loss: 0.4533\n",
      "saved new best metric model at the 90th epoch\n",
      "current epoch: 90 current mean dice: 0.4295 \n",
      "best mean dice: 0.4295  at epoch: 90\n",
      "----------\n",
      "epoch 91/600\n",
      "1/15, train_loss: 0.4241\n",
      "2/15, train_loss: 0.4487\n",
      "3/15, train_loss: 0.5398\n",
      "4/15, train_loss: 0.3955\n",
      "5/15, train_loss: 0.5003\n",
      "6/15, train_loss: 0.4520\n",
      "7/15, train_loss: 0.3990\n",
      "8/15, train_loss: 0.4369\n",
      "9/15, train_loss: 0.5136\n",
      "10/15, train_loss: 0.4217\n",
      "11/15, train_loss: 0.4524\n",
      "12/15, train_loss: 0.4088\n",
      "13/15, train_loss: 0.4264\n",
      "14/15, train_loss: 0.4482\n",
      "15/15, train_loss: 0.4154\n",
      "epoch 91 average loss: 0.4455\n",
      "----------\n",
      "epoch 92/600\n",
      "1/15, train_loss: 0.4412\n",
      "2/15, train_loss: 0.4313\n",
      "3/15, train_loss: 0.4131\n",
      "4/15, train_loss: 0.4175\n",
      "5/15, train_loss: 0.4658\n",
      "6/15, train_loss: 0.4214\n",
      "7/15, train_loss: 0.4119\n",
      "8/15, train_loss: 0.5060\n",
      "9/15, train_loss: 0.4403\n",
      "10/15, train_loss: 0.4936\n",
      "11/15, train_loss: 0.4791\n",
      "12/15, train_loss: 0.4220\n",
      "13/15, train_loss: 0.4427\n",
      "14/15, train_loss: 0.4337\n",
      "15/15, train_loss: 0.4092\n",
      "epoch 92 average loss: 0.4419\n",
      "----------\n",
      "epoch 93/600\n",
      "1/15, train_loss: 0.4347\n",
      "2/15, train_loss: 0.4576\n",
      "3/15, train_loss: 0.5329\n",
      "4/15, train_loss: 0.4253\n",
      "5/15, train_loss: 0.3972\n",
      "6/15, train_loss: 0.4165\n",
      "7/15, train_loss: 0.4827\n",
      "8/15, train_loss: 0.4046\n",
      "9/15, train_loss: 0.4331\n",
      "10/15, train_loss: 0.4343\n",
      "11/15, train_loss: 0.4201\n",
      "12/15, train_loss: 0.4033\n",
      "13/15, train_loss: 0.4556\n",
      "14/15, train_loss: 0.4347\n",
      "15/15, train_loss: 0.4181\n",
      "epoch 93 average loss: 0.4367\n",
      "----------\n",
      "epoch 94/600\n",
      "1/15, train_loss: 0.4504\n",
      "2/15, train_loss: 0.4468\n",
      "3/15, train_loss: 0.4358\n",
      "4/15, train_loss: 0.4300\n",
      "5/15, train_loss: 0.4203\n",
      "6/15, train_loss: 0.4525\n",
      "7/15, train_loss: 0.4037\n",
      "8/15, train_loss: 0.6173\n",
      "9/15, train_loss: 0.4157\n",
      "10/15, train_loss: 0.4003\n",
      "11/15, train_loss: 0.4290\n",
      "12/15, train_loss: 0.4306\n",
      "13/15, train_loss: 0.4354\n",
      "14/15, train_loss: 0.3955\n",
      "15/15, train_loss: 0.4601\n",
      "epoch 94 average loss: 0.4416\n",
      "----------\n",
      "epoch 95/600\n",
      "1/15, train_loss: 0.4116\n",
      "2/15, train_loss: 0.5091\n",
      "3/15, train_loss: 0.3932\n",
      "4/15, train_loss: 0.4813\n",
      "5/15, train_loss: 0.4529\n",
      "6/15, train_loss: 0.4340\n",
      "7/15, train_loss: 0.4107\n",
      "8/15, train_loss: 0.4227\n",
      "9/15, train_loss: 0.4023\n",
      "10/15, train_loss: 0.4624\n",
      "11/15, train_loss: 0.4192\n",
      "12/15, train_loss: 0.4829\n",
      "13/15, train_loss: 0.4021\n",
      "14/15, train_loss: 0.4111\n",
      "15/15, train_loss: 0.4450\n",
      "epoch 95 average loss: 0.4360\n",
      "saved new best metric model at the 95th epoch\n",
      "current epoch: 95 current mean dice: 0.4490 \n",
      "best mean dice: 0.4490  at epoch: 95\n",
      "----------\n",
      "epoch 96/600\n",
      "1/15, train_loss: 0.4185\n",
      "2/15, train_loss: 0.4468\n",
      "3/15, train_loss: 0.4492\n",
      "4/15, train_loss: 0.4191\n",
      "5/15, train_loss: 0.4418\n",
      "6/15, train_loss: 0.5347\n",
      "7/15, train_loss: 0.4286\n",
      "8/15, train_loss: 0.4211\n",
      "9/15, train_loss: 0.4404\n",
      "10/15, train_loss: 0.4633\n",
      "11/15, train_loss: 0.4105\n",
      "12/15, train_loss: 0.4469\n",
      "13/15, train_loss: 0.4301\n",
      "14/15, train_loss: 0.4589\n",
      "15/15, train_loss: 0.4914\n",
      "epoch 96 average loss: 0.4467\n",
      "----------\n",
      "epoch 97/600\n",
      "1/15, train_loss: 0.5199\n",
      "2/15, train_loss: 0.4349\n",
      "3/15, train_loss: 0.4193\n",
      "4/15, train_loss: 0.4345\n",
      "5/15, train_loss: 0.4053\n",
      "6/15, train_loss: 0.4263\n",
      "7/15, train_loss: 0.3864\n",
      "8/15, train_loss: 0.4686\n",
      "9/15, train_loss: 0.4106\n",
      "10/15, train_loss: 0.4039\n",
      "11/15, train_loss: 0.4389\n",
      "12/15, train_loss: 0.4283\n",
      "13/15, train_loss: 0.4525\n",
      "14/15, train_loss: 0.4256\n",
      "15/15, train_loss: 0.4225\n",
      "epoch 97 average loss: 0.4318\n",
      "----------\n",
      "epoch 98/600\n",
      "1/15, train_loss: 0.4579\n",
      "2/15, train_loss: 0.4305\n",
      "3/15, train_loss: 0.4105\n",
      "4/15, train_loss: 0.4417\n",
      "5/15, train_loss: 0.4147\n",
      "6/15, train_loss: 0.5208\n",
      "7/15, train_loss: 0.4281\n",
      "8/15, train_loss: 0.4466\n",
      "9/15, train_loss: 0.4076\n",
      "10/15, train_loss: 0.4228\n",
      "11/15, train_loss: 0.4312\n",
      "12/15, train_loss: 0.4623\n",
      "13/15, train_loss: 0.4156\n",
      "14/15, train_loss: 0.5040\n",
      "15/15, train_loss: 0.4131\n",
      "epoch 98 average loss: 0.4405\n",
      "----------\n",
      "epoch 99/600\n",
      "1/15, train_loss: 0.4326\n",
      "2/15, train_loss: 0.4265\n",
      "3/15, train_loss: 0.4194\n",
      "4/15, train_loss: 0.4175\n",
      "5/15, train_loss: 0.3975\n",
      "6/15, train_loss: 0.4934\n",
      "7/15, train_loss: 0.4730\n",
      "8/15, train_loss: 0.4574\n",
      "9/15, train_loss: 0.4319\n",
      "10/15, train_loss: 0.3946\n",
      "11/15, train_loss: 0.4464\n",
      "12/15, train_loss: 0.5339\n",
      "13/15, train_loss: 0.4629\n",
      "14/15, train_loss: 0.3941\n",
      "15/15, train_loss: 0.3849\n",
      "epoch 99 average loss: 0.4377\n",
      "----------\n",
      "epoch 100/600\n",
      "1/15, train_loss: 0.4246\n",
      "2/15, train_loss: 0.4432\n",
      "3/15, train_loss: 0.4519\n",
      "4/15, train_loss: 0.4038\n",
      "5/15, train_loss: 0.4049\n",
      "6/15, train_loss: 0.5046\n",
      "7/15, train_loss: 0.5248\n",
      "8/15, train_loss: 0.4443\n",
      "9/15, train_loss: 0.4510\n",
      "10/15, train_loss: 0.4375\n",
      "11/15, train_loss: 0.4588\n",
      "12/15, train_loss: 0.4159\n",
      "13/15, train_loss: 0.4301\n",
      "14/15, train_loss: 0.4230\n",
      "15/15, train_loss: 0.4209\n",
      "epoch 100 average loss: 0.4426\n",
      "current epoch: 100 current mean dice: 0.4369 \n",
      "best mean dice: 0.4490  at epoch: 95\n",
      "----------\n",
      "epoch 101/600\n",
      "1/15, train_loss: 0.4276\n",
      "2/15, train_loss: 0.4071\n",
      "3/15, train_loss: 0.4202\n",
      "4/15, train_loss: 0.4073\n",
      "5/15, train_loss: 0.4320\n",
      "6/15, train_loss: 0.4210\n",
      "7/15, train_loss: 0.3820\n",
      "8/15, train_loss: 0.4025\n",
      "9/15, train_loss: 0.3936\n",
      "10/15, train_loss: 0.4196\n",
      "11/15, train_loss: 0.4249\n",
      "12/15, train_loss: 0.5205\n",
      "13/15, train_loss: 0.4504\n",
      "14/15, train_loss: 0.5174\n",
      "15/15, train_loss: 0.4071\n",
      "epoch 101 average loss: 0.4289\n",
      "----------\n",
      "epoch 102/600\n",
      "1/15, train_loss: 0.4518\n",
      "2/15, train_loss: 0.4529\n",
      "3/15, train_loss: 0.5217\n",
      "4/15, train_loss: 0.4347\n",
      "5/15, train_loss: 0.3923\n",
      "6/15, train_loss: 0.4031\n",
      "7/15, train_loss: 0.3977\n",
      "8/15, train_loss: 0.4128\n",
      "9/15, train_loss: 0.4274\n",
      "10/15, train_loss: 0.4080\n",
      "11/15, train_loss: 0.4402\n",
      "12/15, train_loss: 0.4177\n",
      "13/15, train_loss: 0.4120\n",
      "14/15, train_loss: 0.4108\n",
      "15/15, train_loss: 0.4765\n",
      "epoch 102 average loss: 0.4306\n",
      "----------\n",
      "epoch 103/600\n",
      "1/15, train_loss: 0.4015\n",
      "2/15, train_loss: 0.4393\n",
      "3/15, train_loss: 0.4322\n",
      "4/15, train_loss: 0.4286\n",
      "5/15, train_loss: 0.4995\n",
      "6/15, train_loss: 0.4637\n",
      "7/15, train_loss: 0.4521\n",
      "8/15, train_loss: 0.3997\n",
      "9/15, train_loss: 0.4272\n",
      "10/15, train_loss: 0.3857\n",
      "11/15, train_loss: 0.4312\n",
      "12/15, train_loss: 0.4242\n",
      "13/15, train_loss: 0.3955\n",
      "14/15, train_loss: 0.4942\n",
      "15/15, train_loss: 0.4248\n",
      "epoch 103 average loss: 0.4333\n",
      "----------\n",
      "epoch 104/600\n",
      "1/15, train_loss: 0.4015\n",
      "2/15, train_loss: 0.4921\n",
      "3/15, train_loss: 0.4393\n",
      "4/15, train_loss: 0.4081\n",
      "5/15, train_loss: 0.4098\n",
      "6/15, train_loss: 0.4243\n",
      "7/15, train_loss: 0.4198\n",
      "8/15, train_loss: 0.4099\n",
      "9/15, train_loss: 0.4220\n",
      "10/15, train_loss: 0.4230\n",
      "11/15, train_loss: 0.4155\n",
      "12/15, train_loss: 0.4103\n",
      "13/15, train_loss: 0.4252\n",
      "14/15, train_loss: 0.4381\n",
      "15/15, train_loss: 0.5023\n",
      "epoch 104 average loss: 0.4294\n",
      "----------\n",
      "epoch 105/600\n",
      "1/15, train_loss: 0.4103\n",
      "2/15, train_loss: 0.4357\n",
      "3/15, train_loss: 0.4837\n",
      "4/15, train_loss: 0.4077\n",
      "5/15, train_loss: 0.4237\n",
      "6/15, train_loss: 0.4213\n",
      "7/15, train_loss: 0.3915\n",
      "8/15, train_loss: 0.4047\n",
      "9/15, train_loss: 0.5034\n",
      "10/15, train_loss: 0.4336\n",
      "11/15, train_loss: 0.4296\n",
      "12/15, train_loss: 0.4143\n",
      "13/15, train_loss: 0.4164\n",
      "14/15, train_loss: 0.4096\n",
      "15/15, train_loss: 0.4234\n",
      "epoch 105 average loss: 0.4273\n",
      "saved new best metric model at the 105th epoch\n",
      "current epoch: 105 current mean dice: 0.4557 \n",
      "best mean dice: 0.4557  at epoch: 105\n",
      "----------\n",
      "epoch 106/600\n",
      "1/15, train_loss: 0.4054\n",
      "2/15, train_loss: 0.4729\n",
      "3/15, train_loss: 0.4237\n",
      "4/15, train_loss: 0.3941\n",
      "5/15, train_loss: 0.4494\n",
      "6/15, train_loss: 0.4384\n",
      "7/15, train_loss: 0.4296\n",
      "8/15, train_loss: 0.4363\n",
      "9/15, train_loss: 0.3883\n",
      "10/15, train_loss: 0.4467\n",
      "11/15, train_loss: 0.4915\n",
      "12/15, train_loss: 0.4092\n",
      "13/15, train_loss: 0.4115\n",
      "14/15, train_loss: 0.3979\n",
      "15/15, train_loss: 0.4212\n",
      "epoch 106 average loss: 0.4277\n",
      "----------\n",
      "epoch 107/600\n",
      "1/15, train_loss: 0.4150\n",
      "2/15, train_loss: 0.4319\n",
      "3/15, train_loss: 0.4202\n",
      "4/15, train_loss: 0.3924\n",
      "5/15, train_loss: 0.3968\n",
      "6/15, train_loss: 0.4027\n",
      "7/15, train_loss: 0.4386\n",
      "8/15, train_loss: 0.3995\n",
      "9/15, train_loss: 0.4100\n",
      "10/15, train_loss: 0.4926\n",
      "11/15, train_loss: 0.4173\n",
      "12/15, train_loss: 0.3925\n",
      "13/15, train_loss: 0.3996\n",
      "14/15, train_loss: 0.4718\n",
      "15/15, train_loss: 0.4277\n",
      "epoch 107 average loss: 0.4206\n",
      "----------\n",
      "epoch 108/600\n",
      "1/15, train_loss: 0.4121\n",
      "2/15, train_loss: 0.3748\n",
      "3/15, train_loss: 0.4029\n",
      "4/15, train_loss: 0.4485\n",
      "5/15, train_loss: 0.4216\n",
      "6/15, train_loss: 0.3974\n",
      "7/15, train_loss: 0.4069\n",
      "8/15, train_loss: 0.4575\n",
      "9/15, train_loss: 0.4273\n",
      "10/15, train_loss: 0.4106\n",
      "11/15, train_loss: 0.4964\n",
      "12/15, train_loss: 0.3851\n",
      "13/15, train_loss: 0.4633\n",
      "14/15, train_loss: 0.4238\n",
      "15/15, train_loss: 0.4156\n",
      "epoch 108 average loss: 0.4229\n",
      "----------\n",
      "epoch 109/600\n",
      "1/15, train_loss: 0.4205\n",
      "2/15, train_loss: 0.4135\n",
      "3/15, train_loss: 0.3901\n",
      "4/15, train_loss: 0.4103\n",
      "5/15, train_loss: 0.4167\n",
      "6/15, train_loss: 0.4135\n",
      "7/15, train_loss: 0.4247\n",
      "8/15, train_loss: 0.4927\n",
      "9/15, train_loss: 0.3984\n",
      "10/15, train_loss: 0.4524\n",
      "11/15, train_loss: 0.5042\n",
      "12/15, train_loss: 0.4257\n",
      "13/15, train_loss: 0.3889\n",
      "14/15, train_loss: 0.4102\n",
      "15/15, train_loss: 0.4095\n",
      "epoch 109 average loss: 0.4248\n",
      "----------\n",
      "epoch 110/600\n",
      "1/15, train_loss: 0.3981\n",
      "2/15, train_loss: 0.3982\n",
      "3/15, train_loss: 0.4236\n",
      "4/15, train_loss: 0.4812\n",
      "5/15, train_loss: 0.4779\n",
      "6/15, train_loss: 0.4121\n",
      "7/15, train_loss: 0.3986\n",
      "8/15, train_loss: 0.3880\n",
      "9/15, train_loss: 0.4159\n",
      "10/15, train_loss: 0.4276\n",
      "11/15, train_loss: 0.4219\n",
      "12/15, train_loss: 0.3915\n",
      "13/15, train_loss: 0.4110\n",
      "14/15, train_loss: 0.4243\n",
      "15/15, train_loss: 0.3814\n",
      "epoch 110 average loss: 0.4167\n",
      "current epoch: 110 current mean dice: 0.4547 \n",
      "best mean dice: 0.4557  at epoch: 105\n",
      "----------\n",
      "epoch 111/600\n",
      "1/15, train_loss: 0.3954\n",
      "2/15, train_loss: 0.4099\n",
      "3/15, train_loss: 0.4122\n",
      "4/15, train_loss: 0.4079\n",
      "5/15, train_loss: 0.4217\n",
      "6/15, train_loss: 0.4102\n",
      "7/15, train_loss: 0.4352\n",
      "8/15, train_loss: 0.4972\n",
      "9/15, train_loss: 0.4058\n",
      "10/15, train_loss: 0.3908\n",
      "11/15, train_loss: 0.4049\n",
      "12/15, train_loss: 0.3979\n",
      "13/15, train_loss: 0.3811\n",
      "14/15, train_loss: 0.4310\n",
      "15/15, train_loss: 0.4498\n",
      "epoch 111 average loss: 0.4167\n",
      "----------\n",
      "epoch 112/600\n",
      "1/15, train_loss: 0.4015\n",
      "2/15, train_loss: 0.4162\n",
      "3/15, train_loss: 0.3916\n",
      "4/15, train_loss: 0.4156\n",
      "5/15, train_loss: 0.4961\n",
      "6/15, train_loss: 0.4034\n",
      "7/15, train_loss: 0.3973\n",
      "8/15, train_loss: 0.4475\n",
      "9/15, train_loss: 0.4131\n",
      "10/15, train_loss: 0.4074\n",
      "11/15, train_loss: 0.4157\n",
      "12/15, train_loss: 0.4210\n",
      "13/15, train_loss: 0.3694\n",
      "14/15, train_loss: 0.4643\n",
      "15/15, train_loss: 0.3812\n",
      "epoch 112 average loss: 0.4161\n",
      "----------\n",
      "epoch 113/600\n",
      "1/15, train_loss: 0.4176\n",
      "2/15, train_loss: 0.4179\n",
      "3/15, train_loss: 0.3954\n",
      "4/15, train_loss: 0.4101\n",
      "5/15, train_loss: 0.4626\n",
      "6/15, train_loss: 0.3712\n",
      "7/15, train_loss: 0.3813\n",
      "8/15, train_loss: 0.4050\n",
      "9/15, train_loss: 0.3756\n",
      "10/15, train_loss: 0.3805\n",
      "11/15, train_loss: 0.4316\n",
      "12/15, train_loss: 0.4065\n",
      "13/15, train_loss: 0.4959\n",
      "14/15, train_loss: 0.3932\n",
      "15/15, train_loss: 0.4257\n",
      "epoch 113 average loss: 0.4113\n",
      "----------\n",
      "epoch 114/600\n",
      "1/15, train_loss: 0.4719\n",
      "2/15, train_loss: 0.4154\n",
      "3/15, train_loss: 0.3936\n",
      "4/15, train_loss: 0.4118\n",
      "5/15, train_loss: 0.3940\n",
      "6/15, train_loss: 0.3983\n",
      "7/15, train_loss: 0.3949\n",
      "8/15, train_loss: 0.3938\n",
      "9/15, train_loss: 0.4128\n",
      "10/15, train_loss: 0.3951\n",
      "11/15, train_loss: 0.4813\n",
      "12/15, train_loss: 0.4310\n",
      "13/15, train_loss: 0.4969\n",
      "14/15, train_loss: 0.3917\n",
      "15/15, train_loss: 0.3765\n",
      "epoch 114 average loss: 0.4173\n",
      "----------\n",
      "epoch 115/600\n",
      "1/15, train_loss: 0.3866\n",
      "2/15, train_loss: 0.4188\n",
      "3/15, train_loss: 0.4787\n",
      "4/15, train_loss: 0.4040\n",
      "5/15, train_loss: 0.4003\n",
      "6/15, train_loss: 0.3838\n",
      "7/15, train_loss: 0.3882\n",
      "8/15, train_loss: 0.3821\n",
      "9/15, train_loss: 0.4032\n",
      "10/15, train_loss: 0.4418\n",
      "11/15, train_loss: 0.4613\n",
      "12/15, train_loss: 0.3975\n",
      "13/15, train_loss: 0.4486\n",
      "14/15, train_loss: 0.4229\n",
      "15/15, train_loss: 0.4120\n",
      "epoch 115 average loss: 0.4153\n",
      "saved new best metric model at the 115th epoch\n",
      "current epoch: 115 current mean dice: 0.4600 \n",
      "best mean dice: 0.4600  at epoch: 115\n",
      "----------\n",
      "epoch 116/600\n",
      "1/15, train_loss: 0.3848\n",
      "2/15, train_loss: 0.4511\n",
      "3/15, train_loss: 0.3995\n",
      "4/15, train_loss: 0.4439\n",
      "5/15, train_loss: 0.4858\n",
      "6/15, train_loss: 0.3879\n",
      "7/15, train_loss: 0.3865\n",
      "8/15, train_loss: 0.4101\n",
      "9/15, train_loss: 0.4106\n",
      "10/15, train_loss: 0.3922\n",
      "11/15, train_loss: 0.3913\n",
      "12/15, train_loss: 0.4191\n",
      "13/15, train_loss: 0.4138\n",
      "14/15, train_loss: 0.4261\n",
      "15/15, train_loss: 0.3788\n",
      "epoch 116 average loss: 0.4121\n",
      "----------\n",
      "epoch 117/600\n",
      "1/15, train_loss: 0.3772\n",
      "2/15, train_loss: 0.3973\n",
      "3/15, train_loss: 0.4385\n",
      "4/15, train_loss: 0.4131\n",
      "5/15, train_loss: 0.3819\n",
      "6/15, train_loss: 0.4874\n",
      "7/15, train_loss: 0.3652\n",
      "8/15, train_loss: 0.3904\n",
      "9/15, train_loss: 0.3786\n",
      "10/15, train_loss: 0.4725\n",
      "11/15, train_loss: 0.4352\n",
      "12/15, train_loss: 0.4017\n",
      "13/15, train_loss: 0.4092\n",
      "14/15, train_loss: 0.3946\n",
      "15/15, train_loss: 0.3836\n",
      "epoch 117 average loss: 0.4084\n",
      "----------\n",
      "epoch 118/600\n",
      "1/15, train_loss: 0.3984\n",
      "2/15, train_loss: 0.3854\n",
      "3/15, train_loss: 0.3820\n",
      "4/15, train_loss: 0.4034\n",
      "5/15, train_loss: 0.3711\n",
      "6/15, train_loss: 0.3854\n",
      "7/15, train_loss: 0.3972\n",
      "8/15, train_loss: 0.4398\n",
      "9/15, train_loss: 0.4796\n",
      "10/15, train_loss: 0.3714\n",
      "11/15, train_loss: 0.4155\n",
      "12/15, train_loss: 0.3958\n",
      "13/15, train_loss: 0.3817\n",
      "14/15, train_loss: 0.3750\n",
      "15/15, train_loss: 0.3883\n",
      "epoch 118 average loss: 0.3980\n",
      "----------\n",
      "epoch 119/600\n",
      "1/15, train_loss: 0.3984\n",
      "2/15, train_loss: 0.3987\n",
      "3/15, train_loss: 0.3829\n",
      "4/15, train_loss: 0.3998\n",
      "5/15, train_loss: 0.3961\n",
      "6/15, train_loss: 0.3760\n",
      "7/15, train_loss: 0.4124\n",
      "8/15, train_loss: 0.3984\n",
      "9/15, train_loss: 0.4770\n",
      "10/15, train_loss: 0.3985\n",
      "11/15, train_loss: 0.3912\n",
      "12/15, train_loss: 0.4361\n",
      "13/15, train_loss: 0.3941\n",
      "14/15, train_loss: 0.3929\n",
      "15/15, train_loss: 0.4139\n",
      "epoch 119 average loss: 0.4044\n",
      "----------\n",
      "epoch 120/600\n",
      "1/15, train_loss: 0.4240\n",
      "2/15, train_loss: 0.3774\n",
      "3/15, train_loss: 0.3776\n",
      "4/15, train_loss: 0.4162\n",
      "5/15, train_loss: 0.3704\n",
      "6/15, train_loss: 0.3807\n",
      "7/15, train_loss: 0.3616\n",
      "8/15, train_loss: 0.3857\n",
      "9/15, train_loss: 0.3801\n",
      "10/15, train_loss: 0.3865\n",
      "11/15, train_loss: 0.4258\n",
      "12/15, train_loss: 0.4953\n",
      "13/15, train_loss: 0.3696\n",
      "14/15, train_loss: 0.4027\n",
      "15/15, train_loss: 0.4072\n",
      "epoch 120 average loss: 0.3974\n",
      "saved new best metric model at the 120th epoch\n",
      "current epoch: 120 current mean dice: 0.4759 \n",
      "best mean dice: 0.4759  at epoch: 120\n",
      "----------\n",
      "epoch 121/600\n",
      "1/15, train_loss: 0.4118\n",
      "2/15, train_loss: 0.3890\n",
      "3/15, train_loss: 0.3935\n",
      "4/15, train_loss: 0.4013\n",
      "5/15, train_loss: 0.4062\n",
      "6/15, train_loss: 0.3926\n",
      "7/15, train_loss: 0.3796\n",
      "8/15, train_loss: 0.4971\n",
      "9/15, train_loss: 0.3747\n",
      "10/15, train_loss: 0.3959\n",
      "11/15, train_loss: 0.3871\n",
      "12/15, train_loss: 0.4815\n",
      "13/15, train_loss: 0.4073\n",
      "14/15, train_loss: 0.3877\n",
      "15/15, train_loss: 0.3912\n",
      "epoch 121 average loss: 0.4064\n",
      "----------\n",
      "epoch 122/600\n",
      "1/15, train_loss: 0.3819\n",
      "2/15, train_loss: 0.4214\n",
      "3/15, train_loss: 0.3964\n",
      "4/15, train_loss: 0.3874\n",
      "5/15, train_loss: 0.4228\n",
      "6/15, train_loss: 0.4045\n",
      "7/15, train_loss: 0.3618\n",
      "8/15, train_loss: 0.4642\n",
      "9/15, train_loss: 0.4243\n",
      "10/15, train_loss: 0.4412\n",
      "11/15, train_loss: 0.3955\n",
      "12/15, train_loss: 0.3737\n",
      "13/15, train_loss: 0.3878\n",
      "14/15, train_loss: 0.4030\n",
      "15/15, train_loss: 0.4388\n",
      "epoch 122 average loss: 0.4070\n",
      "----------\n",
      "epoch 123/600\n",
      "1/15, train_loss: 0.3696\n",
      "2/15, train_loss: 0.3943\n",
      "3/15, train_loss: 0.3716\n",
      "4/15, train_loss: 0.4245\n",
      "5/15, train_loss: 0.3572\n",
      "6/15, train_loss: 0.5020\n",
      "7/15, train_loss: 0.3990\n",
      "8/15, train_loss: 0.4020\n",
      "9/15, train_loss: 0.4583\n",
      "10/15, train_loss: 0.3703\n",
      "11/15, train_loss: 0.3863\n",
      "12/15, train_loss: 0.4881\n",
      "13/15, train_loss: 0.3893\n",
      "14/15, train_loss: 0.3908\n",
      "15/15, train_loss: 0.4001\n",
      "epoch 123 average loss: 0.4069\n",
      "----------\n",
      "epoch 124/600\n",
      "1/15, train_loss: 0.3737\n",
      "2/15, train_loss: 0.4044\n",
      "3/15, train_loss: 0.3791\n",
      "4/15, train_loss: 0.3977\n",
      "5/15, train_loss: 0.4538\n",
      "6/15, train_loss: 0.4485\n",
      "7/15, train_loss: 0.3911\n",
      "8/15, train_loss: 0.4006\n",
      "9/15, train_loss: 0.3928\n",
      "10/15, train_loss: 0.4047\n",
      "11/15, train_loss: 0.3631\n",
      "12/15, train_loss: 0.4021\n",
      "13/15, train_loss: 0.3740\n",
      "14/15, train_loss: 0.3573\n",
      "15/15, train_loss: 0.3838\n",
      "epoch 124 average loss: 0.3951\n",
      "----------\n",
      "epoch 125/600\n",
      "1/15, train_loss: 0.3692\n",
      "2/15, train_loss: 0.3718\n",
      "3/15, train_loss: 0.3852\n",
      "4/15, train_loss: 0.4132\n",
      "5/15, train_loss: 0.4088\n",
      "6/15, train_loss: 0.3700\n",
      "7/15, train_loss: 0.4117\n",
      "8/15, train_loss: 0.5379\n",
      "9/15, train_loss: 0.3704\n",
      "10/15, train_loss: 0.4207\n",
      "11/15, train_loss: 0.3700\n",
      "12/15, train_loss: 0.3887\n",
      "13/15, train_loss: 0.3547\n",
      "14/15, train_loss: 0.3943\n",
      "15/15, train_loss: 0.3909\n",
      "epoch 125 average loss: 0.3972\n",
      "saved new best metric model at the 125th epoch\n",
      "current epoch: 125 current mean dice: 0.4861 \n",
      "best mean dice: 0.4861  at epoch: 125\n",
      "----------\n",
      "epoch 126/600\n",
      "1/15, train_loss: 0.3813\n",
      "2/15, train_loss: 0.3896\n",
      "3/15, train_loss: 0.4492\n",
      "4/15, train_loss: 0.3627\n",
      "5/15, train_loss: 0.3857\n",
      "6/15, train_loss: 0.3939\n",
      "7/15, train_loss: 0.4754\n",
      "8/15, train_loss: 0.4036\n",
      "9/15, train_loss: 0.3659\n",
      "10/15, train_loss: 0.3824\n",
      "11/15, train_loss: 0.3759\n",
      "12/15, train_loss: 0.3843\n",
      "13/15, train_loss: 0.3763\n",
      "14/15, train_loss: 0.3994\n",
      "15/15, train_loss: 0.3628\n",
      "epoch 126 average loss: 0.3926\n",
      "----------\n",
      "epoch 127/600\n",
      "1/15, train_loss: 0.4068\n",
      "2/15, train_loss: 0.3635\n",
      "3/15, train_loss: 0.4120\n",
      "4/15, train_loss: 0.4171\n",
      "5/15, train_loss: 0.4844\n",
      "6/15, train_loss: 0.3631\n",
      "7/15, train_loss: 0.4584\n",
      "8/15, train_loss: 0.4016\n",
      "9/15, train_loss: 0.4114\n",
      "10/15, train_loss: 0.3574\n",
      "11/15, train_loss: 0.4045\n",
      "12/15, train_loss: 0.3572\n",
      "13/15, train_loss: 0.3777\n",
      "14/15, train_loss: 0.3571\n",
      "15/15, train_loss: 0.3657\n",
      "epoch 127 average loss: 0.3959\n",
      "----------\n",
      "epoch 128/600\n",
      "1/15, train_loss: 0.3732\n",
      "2/15, train_loss: 0.3704\n",
      "3/15, train_loss: 0.4021\n",
      "4/15, train_loss: 0.3780\n",
      "5/15, train_loss: 0.3721\n",
      "6/15, train_loss: 0.3565\n",
      "7/15, train_loss: 0.3795\n",
      "8/15, train_loss: 0.3545\n",
      "9/15, train_loss: 0.4552\n",
      "10/15, train_loss: 0.4075\n",
      "11/15, train_loss: 0.3958\n",
      "12/15, train_loss: 0.4335\n",
      "13/15, train_loss: 0.3736\n",
      "14/15, train_loss: 0.3757\n",
      "15/15, train_loss: 0.4034\n",
      "epoch 128 average loss: 0.3887\n",
      "----------\n",
      "epoch 129/600\n",
      "1/15, train_loss: 0.3781\n",
      "2/15, train_loss: 0.3640\n",
      "3/15, train_loss: 0.4261\n",
      "4/15, train_loss: 0.3787\n",
      "5/15, train_loss: 0.4618\n",
      "6/15, train_loss: 0.4052\n",
      "7/15, train_loss: 0.4044\n",
      "8/15, train_loss: 0.3903\n",
      "9/15, train_loss: 0.3759\n",
      "10/15, train_loss: 0.3643\n",
      "11/15, train_loss: 0.3532\n",
      "12/15, train_loss: 0.3770\n",
      "13/15, train_loss: 0.4291\n",
      "14/15, train_loss: 0.3673\n",
      "15/15, train_loss: 0.3918\n",
      "epoch 129 average loss: 0.3911\n",
      "----------\n",
      "epoch 130/600\n",
      "1/15, train_loss: 0.3933\n",
      "2/15, train_loss: 0.3862\n",
      "3/15, train_loss: 0.3484\n",
      "4/15, train_loss: 0.3880\n",
      "5/15, train_loss: 0.4045\n",
      "6/15, train_loss: 0.3837\n",
      "7/15, train_loss: 0.3797\n",
      "8/15, train_loss: 0.4659\n",
      "9/15, train_loss: 0.4223\n",
      "10/15, train_loss: 0.3853\n",
      "11/15, train_loss: 0.3654\n",
      "12/15, train_loss: 0.3952\n",
      "13/15, train_loss: 0.4665\n",
      "14/15, train_loss: 0.3658\n",
      "15/15, train_loss: 0.3574\n",
      "epoch 130 average loss: 0.3938\n",
      "saved new best metric model at the 130th epoch\n",
      "current epoch: 130 current mean dice: 0.5318 \n",
      "best mean dice: 0.5318  at epoch: 130\n",
      "----------\n",
      "epoch 131/600\n",
      "1/15, train_loss: 0.3612\n",
      "2/15, train_loss: 0.3524\n",
      "3/15, train_loss: 0.3689\n",
      "4/15, train_loss: 0.3736\n",
      "5/15, train_loss: 0.4206\n",
      "6/15, train_loss: 0.3439\n",
      "7/15, train_loss: 0.4029\n",
      "8/15, train_loss: 0.3810\n",
      "9/15, train_loss: 0.3644\n",
      "10/15, train_loss: 0.3475\n",
      "11/15, train_loss: 0.4637\n",
      "12/15, train_loss: 0.3940\n",
      "13/15, train_loss: 0.3968\n",
      "14/15, train_loss: 0.3771\n",
      "15/15, train_loss: 0.3599\n",
      "epoch 131 average loss: 0.3805\n",
      "----------\n",
      "epoch 132/600\n",
      "1/15, train_loss: 0.5185\n",
      "2/15, train_loss: 0.3489\n",
      "3/15, train_loss: 0.3682\n",
      "4/15, train_loss: 0.3355\n",
      "5/15, train_loss: 0.3524\n",
      "6/15, train_loss: 0.4168\n",
      "7/15, train_loss: 0.3285\n",
      "8/15, train_loss: 0.4014\n",
      "9/15, train_loss: 0.3385\n",
      "10/15, train_loss: 0.3410\n",
      "11/15, train_loss: 0.3582\n",
      "12/15, train_loss: 0.3521\n",
      "13/15, train_loss: 0.3603\n",
      "14/15, train_loss: 0.3704\n",
      "15/15, train_loss: 0.3560\n",
      "epoch 132 average loss: 0.3698\n",
      "----------\n",
      "epoch 133/600\n",
      "1/15, train_loss: 0.4025\n",
      "2/15, train_loss: 0.3458\n",
      "3/15, train_loss: 0.3560\n",
      "4/15, train_loss: 0.3737\n",
      "5/15, train_loss: 0.3331\n",
      "6/15, train_loss: 0.3459\n",
      "7/15, train_loss: 0.3665\n",
      "8/15, train_loss: 0.5056\n",
      "9/15, train_loss: 0.3376\n",
      "10/15, train_loss: 0.3914\n",
      "11/15, train_loss: 0.3343\n",
      "12/15, train_loss: 0.3606\n",
      "13/15, train_loss: 0.3370\n",
      "14/15, train_loss: 0.3896\n",
      "15/15, train_loss: 0.3527\n",
      "epoch 133 average loss: 0.3688\n",
      "----------\n",
      "epoch 134/600\n",
      "1/15, train_loss: 0.3305\n",
      "2/15, train_loss: 0.4325\n",
      "3/15, train_loss: 0.3594\n",
      "4/15, train_loss: 0.3858\n",
      "5/15, train_loss: 0.3575\n",
      "6/15, train_loss: 0.3516\n",
      "7/15, train_loss: 0.3310\n",
      "8/15, train_loss: 0.3561\n",
      "9/15, train_loss: 0.3257\n",
      "10/15, train_loss: 0.3855\n",
      "11/15, train_loss: 0.3548\n",
      "12/15, train_loss: 0.3221\n",
      "13/15, train_loss: 0.4496\n",
      "14/15, train_loss: 0.3377\n",
      "15/15, train_loss: 0.3367\n",
      "epoch 134 average loss: 0.3611\n",
      "----------\n",
      "epoch 135/600\n",
      "1/15, train_loss: 0.3831\n",
      "2/15, train_loss: 0.3162\n",
      "3/15, train_loss: 0.3514\n",
      "4/15, train_loss: 0.3338\n",
      "5/15, train_loss: 0.3535\n",
      "6/15, train_loss: 0.3444\n",
      "7/15, train_loss: 0.3618\n",
      "8/15, train_loss: 0.3578\n",
      "9/15, train_loss: 0.3239\n",
      "10/15, train_loss: 0.3286\n",
      "11/15, train_loss: 0.3350\n",
      "12/15, train_loss: 0.4051\n",
      "13/15, train_loss: 0.4195\n",
      "14/15, train_loss: 0.3083\n",
      "15/15, train_loss: 0.3646\n",
      "epoch 135 average loss: 0.3525\n",
      "saved new best metric model at the 135th epoch\n",
      "current epoch: 135 current mean dice: 0.7209 \n",
      "best mean dice: 0.7209  at epoch: 135\n",
      "----------\n",
      "epoch 136/600\n",
      "1/15, train_loss: 0.3764\n",
      "2/15, train_loss: 0.3441\n",
      "3/15, train_loss: 0.3460\n",
      "4/15, train_loss: 0.3276\n",
      "5/15, train_loss: 0.3375\n",
      "6/15, train_loss: 0.4241\n",
      "7/15, train_loss: 0.3215\n",
      "8/15, train_loss: 0.4221\n",
      "9/15, train_loss: 0.3353\n",
      "10/15, train_loss: 0.3297\n",
      "11/15, train_loss: 0.3051\n",
      "12/15, train_loss: 0.3066\n",
      "13/15, train_loss: 0.3550\n",
      "14/15, train_loss: 0.3350\n",
      "15/15, train_loss: 0.3127\n",
      "epoch 136 average loss: 0.3453\n",
      "----------\n",
      "epoch 137/600\n",
      "1/15, train_loss: 0.3308\n",
      "2/15, train_loss: 0.3284\n",
      "3/15, train_loss: 0.3143\n",
      "4/15, train_loss: 0.3481\n",
      "5/15, train_loss: 0.3049\n",
      "6/15, train_loss: 0.3461\n",
      "7/15, train_loss: 0.2982\n",
      "8/15, train_loss: 0.3482\n",
      "9/15, train_loss: 0.3275\n",
      "10/15, train_loss: 0.3570\n",
      "11/15, train_loss: 0.5181\n",
      "12/15, train_loss: 0.3709\n",
      "13/15, train_loss: 0.3178\n",
      "14/15, train_loss: 0.3262\n",
      "15/15, train_loss: 0.3388\n",
      "epoch 137 average loss: 0.3450\n",
      "----------\n",
      "epoch 138/600\n",
      "1/15, train_loss: 0.3214\n",
      "2/15, train_loss: 0.3124\n",
      "3/15, train_loss: 0.3439\n",
      "4/15, train_loss: 0.3314\n",
      "5/15, train_loss: 0.4082\n",
      "6/15, train_loss: 0.3647\n",
      "7/15, train_loss: 0.3295\n",
      "8/15, train_loss: 0.3632\n",
      "9/15, train_loss: 0.2966\n",
      "10/15, train_loss: 0.2978\n",
      "11/15, train_loss: 0.3477\n",
      "12/15, train_loss: 0.3281\n",
      "13/15, train_loss: 0.3158\n",
      "14/15, train_loss: 0.3227\n",
      "15/15, train_loss: 0.3103\n",
      "epoch 138 average loss: 0.3329\n",
      "----------\n",
      "epoch 139/600\n",
      "1/15, train_loss: 0.3365\n",
      "2/15, train_loss: 0.3607\n",
      "3/15, train_loss: 0.2945\n",
      "4/15, train_loss: 0.4210\n",
      "5/15, train_loss: 0.3836\n",
      "6/15, train_loss: 0.3006\n",
      "7/15, train_loss: 0.3119\n",
      "8/15, train_loss: 0.3170\n",
      "9/15, train_loss: 0.3349\n",
      "10/15, train_loss: 0.3566\n",
      "11/15, train_loss: 0.2840\n",
      "12/15, train_loss: 0.3574\n",
      "13/15, train_loss: 0.3180\n",
      "14/15, train_loss: 0.3272\n",
      "15/15, train_loss: 0.2966\n",
      "epoch 139 average loss: 0.3334\n",
      "----------\n",
      "epoch 140/600\n",
      "1/15, train_loss: 0.2969\n",
      "2/15, train_loss: 0.2897\n",
      "3/15, train_loss: 0.3432\n",
      "4/15, train_loss: 0.3204\n",
      "5/15, train_loss: 0.3120\n",
      "6/15, train_loss: 0.3065\n",
      "7/15, train_loss: 0.3394\n",
      "8/15, train_loss: 0.3256\n",
      "9/15, train_loss: 0.3576\n",
      "10/15, train_loss: 0.3263\n",
      "11/15, train_loss: 0.3063\n",
      "12/15, train_loss: 0.3102\n",
      "13/15, train_loss: 0.3819\n",
      "14/15, train_loss: 0.3208\n",
      "15/15, train_loss: 0.2993\n",
      "epoch 140 average loss: 0.3224\n",
      "current epoch: 140 current mean dice: 0.7067 \n",
      "best mean dice: 0.7209  at epoch: 135\n",
      "----------\n",
      "epoch 141/600\n",
      "1/15, train_loss: 0.2989\n",
      "2/15, train_loss: 0.2874\n",
      "3/15, train_loss: 0.3001\n",
      "4/15, train_loss: 0.2949\n",
      "5/15, train_loss: 0.3008\n",
      "6/15, train_loss: 0.3598\n",
      "7/15, train_loss: 0.3427\n",
      "8/15, train_loss: 0.3396\n",
      "9/15, train_loss: 0.3164\n",
      "10/15, train_loss: 0.2821\n",
      "11/15, train_loss: 0.3013\n",
      "12/15, train_loss: 0.3126\n",
      "13/15, train_loss: 0.4519\n",
      "14/15, train_loss: 0.3277\n",
      "15/15, train_loss: 0.3188\n",
      "epoch 141 average loss: 0.3223\n",
      "----------\n",
      "epoch 142/600\n",
      "1/15, train_loss: 0.2921\n",
      "2/15, train_loss: 0.3319\n",
      "3/15, train_loss: 0.3030\n",
      "4/15, train_loss: 0.2913\n",
      "5/15, train_loss: 0.2966\n",
      "6/15, train_loss: 0.3349\n",
      "7/15, train_loss: 0.3102\n",
      "8/15, train_loss: 0.3251\n",
      "9/15, train_loss: 0.3067\n",
      "10/15, train_loss: 0.3804\n",
      "11/15, train_loss: 0.4046\n",
      "12/15, train_loss: 0.3001\n",
      "13/15, train_loss: 0.3104\n",
      "14/15, train_loss: 0.3090\n",
      "15/15, train_loss: 0.3267\n",
      "epoch 142 average loss: 0.3216\n",
      "----------\n",
      "epoch 143/600\n",
      "1/15, train_loss: 0.3151\n",
      "2/15, train_loss: 0.3221\n",
      "3/15, train_loss: 0.2667\n",
      "4/15, train_loss: 0.2798\n",
      "5/15, train_loss: 0.3008\n",
      "6/15, train_loss: 0.3201\n",
      "7/15, train_loss: 0.2588\n",
      "8/15, train_loss: 0.2932\n",
      "9/15, train_loss: 0.2726\n",
      "10/15, train_loss: 0.3863\n",
      "11/15, train_loss: 0.2905\n",
      "12/15, train_loss: 0.4264\n",
      "13/15, train_loss: 0.3080\n",
      "14/15, train_loss: 0.3209\n",
      "15/15, train_loss: 0.3276\n",
      "epoch 143 average loss: 0.3126\n",
      "----------\n",
      "epoch 144/600\n",
      "1/15, train_loss: 0.2683\n",
      "2/15, train_loss: 0.3132\n",
      "3/15, train_loss: 0.2955\n",
      "4/15, train_loss: 0.4308\n",
      "5/15, train_loss: 0.2761\n",
      "6/15, train_loss: 0.3035\n",
      "7/15, train_loss: 0.2729\n",
      "8/15, train_loss: 0.2573\n",
      "9/15, train_loss: 0.4008\n",
      "10/15, train_loss: 0.3217\n",
      "11/15, train_loss: 0.2913\n",
      "12/15, train_loss: 0.2988\n",
      "13/15, train_loss: 0.3201\n",
      "14/15, train_loss: 0.2922\n",
      "15/15, train_loss: 0.2659\n",
      "epoch 144 average loss: 0.3072\n",
      "----------\n",
      "epoch 145/600\n",
      "1/15, train_loss: 0.3319\n",
      "2/15, train_loss: 0.3201\n",
      "3/15, train_loss: 0.2902\n",
      "4/15, train_loss: 0.2903\n",
      "5/15, train_loss: 0.2966\n",
      "6/15, train_loss: 0.3082\n",
      "7/15, train_loss: 0.2819\n",
      "8/15, train_loss: 0.3620\n",
      "9/15, train_loss: 0.2923\n",
      "10/15, train_loss: 0.3092\n",
      "11/15, train_loss: 0.3074\n",
      "12/15, train_loss: 0.2958\n",
      "13/15, train_loss: 0.3139\n",
      "14/15, train_loss: 0.2485\n",
      "15/15, train_loss: 0.3016\n",
      "epoch 145 average loss: 0.3033\n",
      "saved new best metric model at the 145th epoch\n",
      "current epoch: 145 current mean dice: 0.7379 \n",
      "best mean dice: 0.7379  at epoch: 145\n",
      "----------\n",
      "epoch 146/600\n",
      "1/15, train_loss: 0.2674\n",
      "2/15, train_loss: 0.2941\n",
      "3/15, train_loss: 0.3240\n",
      "4/15, train_loss: 0.2572\n",
      "5/15, train_loss: 0.2657\n",
      "6/15, train_loss: 0.2925\n",
      "7/15, train_loss: 0.2913\n",
      "8/15, train_loss: 0.2831\n",
      "9/15, train_loss: 0.2638\n",
      "10/15, train_loss: 0.3020\n",
      "11/15, train_loss: 0.3106\n",
      "12/15, train_loss: 0.2617\n",
      "13/15, train_loss: 0.2680\n",
      "14/15, train_loss: 0.2644\n",
      "15/15, train_loss: 0.4062\n",
      "epoch 146 average loss: 0.2901\n",
      "----------\n",
      "epoch 147/600\n",
      "1/15, train_loss: 0.2452\n",
      "2/15, train_loss: 0.2844\n",
      "3/15, train_loss: 0.2572\n",
      "4/15, train_loss: 0.2667\n",
      "5/15, train_loss: 0.2608\n",
      "6/15, train_loss: 0.2829\n",
      "7/15, train_loss: 0.2914\n",
      "8/15, train_loss: 0.3594\n",
      "9/15, train_loss: 0.3203\n",
      "10/15, train_loss: 0.2848\n",
      "11/15, train_loss: 0.2924\n",
      "12/15, train_loss: 0.2824\n",
      "13/15, train_loss: 0.2705\n",
      "14/15, train_loss: 0.3950\n",
      "15/15, train_loss: 0.2918\n",
      "epoch 147 average loss: 0.2923\n",
      "----------\n",
      "epoch 148/600\n",
      "1/15, train_loss: 0.2779\n",
      "2/15, train_loss: 0.2866\n",
      "3/15, train_loss: 0.3517\n",
      "4/15, train_loss: 0.2850\n",
      "5/15, train_loss: 0.3103\n",
      "6/15, train_loss: 0.3014\n",
      "7/15, train_loss: 0.3279\n",
      "8/15, train_loss: 0.2596\n",
      "9/15, train_loss: 0.2450\n",
      "10/15, train_loss: 0.2617\n",
      "11/15, train_loss: 0.2468\n",
      "12/15, train_loss: 0.3632\n",
      "13/15, train_loss: 0.2378\n",
      "14/15, train_loss: 0.2926\n",
      "15/15, train_loss: 0.2842\n",
      "epoch 148 average loss: 0.2888\n",
      "----------\n",
      "epoch 149/600\n",
      "1/15, train_loss: 0.3157\n",
      "2/15, train_loss: 0.2660\n",
      "3/15, train_loss: 0.3001\n",
      "4/15, train_loss: 0.2692\n",
      "5/15, train_loss: 0.2220\n",
      "6/15, train_loss: 0.3811\n",
      "7/15, train_loss: 0.2525\n",
      "8/15, train_loss: 0.3627\n",
      "9/15, train_loss: 0.2629\n",
      "10/15, train_loss: 0.2816\n",
      "11/15, train_loss: 0.2628\n",
      "12/15, train_loss: 0.3025\n",
      "13/15, train_loss: 0.2319\n",
      "14/15, train_loss: 0.2949\n",
      "15/15, train_loss: 0.2970\n",
      "epoch 149 average loss: 0.2869\n",
      "----------\n",
      "epoch 150/600\n",
      "1/15, train_loss: 0.2725\n",
      "2/15, train_loss: 0.3599\n",
      "3/15, train_loss: 0.2919\n",
      "4/15, train_loss: 0.2734\n",
      "5/15, train_loss: 0.2834\n",
      "6/15, train_loss: 0.2525\n",
      "7/15, train_loss: 0.2572\n",
      "8/15, train_loss: 0.2650\n",
      "9/15, train_loss: 0.2280\n",
      "10/15, train_loss: 0.2903\n",
      "11/15, train_loss: 0.2641\n",
      "12/15, train_loss: 0.2578\n",
      "13/15, train_loss: 0.2440\n",
      "14/15, train_loss: 0.3760\n",
      "15/15, train_loss: 0.2501\n",
      "epoch 150 average loss: 0.2777\n",
      "current epoch: 150 current mean dice: 0.7246 \n",
      "best mean dice: 0.7379  at epoch: 145\n",
      "----------\n",
      "epoch 151/600\n",
      "1/15, train_loss: 0.2249\n",
      "2/15, train_loss: 0.2735\n",
      "3/15, train_loss: 0.3148\n",
      "4/15, train_loss: 0.2373\n",
      "5/15, train_loss: 0.2268\n",
      "6/15, train_loss: 0.2835\n",
      "7/15, train_loss: 0.3838\n",
      "8/15, train_loss: 0.2562\n",
      "9/15, train_loss: 0.2915\n",
      "10/15, train_loss: 0.2548\n",
      "11/15, train_loss: 0.2374\n",
      "12/15, train_loss: 0.2284\n",
      "13/15, train_loss: 0.2588\n",
      "14/15, train_loss: 0.2514\n",
      "15/15, train_loss: 0.3241\n",
      "epoch 151 average loss: 0.2698\n",
      "----------\n",
      "epoch 152/600\n",
      "1/15, train_loss: 0.2238\n",
      "2/15, train_loss: 0.3284\n",
      "3/15, train_loss: 0.2331\n",
      "4/15, train_loss: 0.3047\n",
      "5/15, train_loss: 0.2285\n",
      "6/15, train_loss: 0.2630\n",
      "7/15, train_loss: 0.2686\n",
      "8/15, train_loss: 0.2541\n",
      "9/15, train_loss: 0.2232\n",
      "10/15, train_loss: 0.2210\n",
      "11/15, train_loss: 0.3112\n",
      "12/15, train_loss: 0.2386\n",
      "13/15, train_loss: 0.2579\n",
      "14/15, train_loss: 0.2773\n",
      "15/15, train_loss: 0.2414\n",
      "epoch 152 average loss: 0.2583\n",
      "----------\n",
      "epoch 153/600\n",
      "1/15, train_loss: 0.2313\n",
      "2/15, train_loss: 0.2247\n",
      "3/15, train_loss: 0.2545\n",
      "4/15, train_loss: 0.2475\n",
      "5/15, train_loss: 0.2410\n",
      "6/15, train_loss: 0.2334\n",
      "7/15, train_loss: 0.2386\n",
      "8/15, train_loss: 0.2117\n",
      "9/15, train_loss: 0.2501\n",
      "10/15, train_loss: 0.3484\n",
      "11/15, train_loss: 0.2674\n",
      "12/15, train_loss: 0.3109\n",
      "13/15, train_loss: 0.2106\n",
      "14/15, train_loss: 0.2538\n",
      "15/15, train_loss: 0.2794\n",
      "epoch 153 average loss: 0.2535\n",
      "----------\n",
      "epoch 154/600\n",
      "1/15, train_loss: 0.2477\n",
      "2/15, train_loss: 0.2706\n",
      "3/15, train_loss: 0.2474\n",
      "4/15, train_loss: 0.2291\n",
      "5/15, train_loss: 0.2363\n",
      "6/15, train_loss: 0.3551\n",
      "7/15, train_loss: 0.3417\n",
      "8/15, train_loss: 0.2507\n",
      "9/15, train_loss: 0.2133\n",
      "10/15, train_loss: 0.2266\n",
      "11/15, train_loss: 0.2438\n",
      "12/15, train_loss: 0.2247\n",
      "13/15, train_loss: 0.2103\n",
      "14/15, train_loss: 0.2265\n",
      "15/15, train_loss: 0.2103\n",
      "epoch 154 average loss: 0.2489\n",
      "----------\n",
      "epoch 155/600\n",
      "1/15, train_loss: 0.2640\n",
      "2/15, train_loss: 0.2116\n",
      "3/15, train_loss: 0.1910\n",
      "4/15, train_loss: 0.2215\n",
      "5/15, train_loss: 0.1911\n",
      "6/15, train_loss: 0.2271\n",
      "7/15, train_loss: 0.2360\n",
      "8/15, train_loss: 0.1723\n",
      "9/15, train_loss: 0.1985\n",
      "10/15, train_loss: 0.3654\n",
      "11/15, train_loss: 0.1844\n",
      "12/15, train_loss: 0.2239\n",
      "13/15, train_loss: 0.2195\n",
      "14/15, train_loss: 0.3207\n",
      "15/15, train_loss: 0.1725\n",
      "epoch 155 average loss: 0.2267\n",
      "saved new best metric model at the 155th epoch\n",
      "current epoch: 155 current mean dice: 0.7524 \n",
      "best mean dice: 0.7524  at epoch: 155\n",
      "----------\n",
      "epoch 156/600\n",
      "1/15, train_loss: 0.2158\n",
      "2/15, train_loss: 0.2058\n",
      "3/15, train_loss: 0.2752\n",
      "4/15, train_loss: 0.2089\n",
      "5/15, train_loss: 0.1870\n",
      "6/15, train_loss: 0.1706\n",
      "7/15, train_loss: 0.2063\n",
      "8/15, train_loss: 0.1879\n",
      "9/15, train_loss: 0.2922\n",
      "10/15, train_loss: 0.1953\n",
      "11/15, train_loss: 0.1979\n",
      "12/15, train_loss: 0.2348\n",
      "13/15, train_loss: 0.2108\n",
      "14/15, train_loss: 0.2179\n",
      "15/15, train_loss: 0.1660\n",
      "epoch 156 average loss: 0.2115\n",
      "----------\n",
      "epoch 157/600\n",
      "1/15, train_loss: 0.2053\n",
      "2/15, train_loss: 0.3112\n",
      "3/15, train_loss: 0.1733\n",
      "4/15, train_loss: 0.2072\n",
      "5/15, train_loss: 0.1828\n",
      "6/15, train_loss: 0.2017\n",
      "7/15, train_loss: 0.1758\n",
      "8/15, train_loss: 0.1827\n",
      "9/15, train_loss: 0.1721\n",
      "10/15, train_loss: 0.1748\n",
      "11/15, train_loss: 0.2529\n",
      "12/15, train_loss: 0.1756\n",
      "13/15, train_loss: 0.1824\n",
      "14/15, train_loss: 0.1524\n",
      "15/15, train_loss: 0.2995\n",
      "epoch 157 average loss: 0.2033\n",
      "----------\n",
      "epoch 158/600\n",
      "1/15, train_loss: 0.2039\n",
      "2/15, train_loss: 0.1487\n",
      "3/15, train_loss: 0.3493\n",
      "4/15, train_loss: 0.1835\n",
      "5/15, train_loss: 0.2273\n",
      "6/15, train_loss: 0.1640\n",
      "7/15, train_loss: 0.2297\n",
      "8/15, train_loss: 0.2496\n",
      "9/15, train_loss: 0.1910\n",
      "10/15, train_loss: 0.1791\n",
      "11/15, train_loss: 0.2649\n",
      "12/15, train_loss: 0.1870\n",
      "13/15, train_loss: 0.1839\n",
      "14/15, train_loss: 0.1854\n",
      "15/15, train_loss: 0.2021\n",
      "epoch 158 average loss: 0.2100\n",
      "----------\n",
      "epoch 159/600\n",
      "1/15, train_loss: 0.3016\n",
      "2/15, train_loss: 0.2094\n",
      "3/15, train_loss: 0.2038\n",
      "4/15, train_loss: 0.2018\n",
      "5/15, train_loss: 0.2239\n",
      "6/15, train_loss: 0.1737\n",
      "7/15, train_loss: 0.2338\n",
      "8/15, train_loss: 0.1631\n",
      "9/15, train_loss: 0.1563\n",
      "10/15, train_loss: 0.1632\n",
      "11/15, train_loss: 0.2049\n",
      "12/15, train_loss: 0.1750\n",
      "13/15, train_loss: 0.1996\n",
      "14/15, train_loss: 0.2179\n",
      "15/15, train_loss: 0.1564\n",
      "epoch 159 average loss: 0.1990\n",
      "----------\n",
      "epoch 160/600\n",
      "1/15, train_loss: 0.1807\n",
      "2/15, train_loss: 0.1650\n",
      "3/15, train_loss: 0.1844\n",
      "4/15, train_loss: 0.1708\n",
      "5/15, train_loss: 0.1744\n",
      "6/15, train_loss: 0.1354\n",
      "7/15, train_loss: 0.1606\n",
      "8/15, train_loss: 0.1583\n",
      "9/15, train_loss: 0.2091\n",
      "10/15, train_loss: 0.2226\n",
      "11/15, train_loss: 0.1614\n",
      "12/15, train_loss: 0.1834\n",
      "13/15, train_loss: 0.1630\n",
      "14/15, train_loss: 0.3058\n",
      "15/15, train_loss: 0.1765\n",
      "epoch 160 average loss: 0.1834\n",
      "saved new best metric model at the 160th epoch\n",
      "current epoch: 160 current mean dice: 0.7655 \n",
      "best mean dice: 0.7655  at epoch: 160\n",
      "----------\n",
      "epoch 161/600\n",
      "1/15, train_loss: 0.2259\n",
      "2/15, train_loss: 0.1913\n",
      "3/15, train_loss: 0.1588\n",
      "4/15, train_loss: 0.1782\n",
      "5/15, train_loss: 0.1819\n",
      "6/15, train_loss: 0.2441\n",
      "7/15, train_loss: 0.1387\n",
      "8/15, train_loss: 0.2281\n",
      "9/15, train_loss: 0.2031\n",
      "10/15, train_loss: 0.1690\n",
      "11/15, train_loss: 0.1465\n",
      "12/15, train_loss: 0.3085\n",
      "13/15, train_loss: 0.1538\n",
      "14/15, train_loss: 0.1289\n",
      "15/15, train_loss: 0.1302\n",
      "epoch 161 average loss: 0.1858\n",
      "----------\n",
      "epoch 162/600\n",
      "1/15, train_loss: 0.1554\n",
      "2/15, train_loss: 0.2208\n",
      "3/15, train_loss: 0.1494\n",
      "4/15, train_loss: 0.1857\n",
      "5/15, train_loss: 0.1857\n",
      "6/15, train_loss: 0.2303\n",
      "7/15, train_loss: 0.2588\n",
      "8/15, train_loss: 0.1510\n",
      "9/15, train_loss: 0.1315\n",
      "10/15, train_loss: 0.1243\n",
      "11/15, train_loss: 0.1616\n",
      "12/15, train_loss: 0.1412\n",
      "13/15, train_loss: 0.2094\n",
      "14/15, train_loss: 0.1441\n",
      "15/15, train_loss: 0.2849\n",
      "epoch 162 average loss: 0.1823\n",
      "----------\n",
      "epoch 163/600\n",
      "1/15, train_loss: 0.1437\n",
      "2/15, train_loss: 0.2201\n",
      "3/15, train_loss: 0.2029\n",
      "4/15, train_loss: 0.1782\n",
      "5/15, train_loss: 0.1429\n",
      "6/15, train_loss: 0.3311\n",
      "7/15, train_loss: 0.1343\n",
      "8/15, train_loss: 0.1710\n",
      "9/15, train_loss: 0.1298\n",
      "10/15, train_loss: 0.1986\n",
      "11/15, train_loss: 0.1468\n",
      "12/15, train_loss: 0.2171\n",
      "13/15, train_loss: 0.1347\n",
      "14/15, train_loss: 0.1464\n",
      "15/15, train_loss: 0.1403\n",
      "epoch 163 average loss: 0.1759\n",
      "----------\n",
      "epoch 164/600\n",
      "1/15, train_loss: 0.1455\n",
      "2/15, train_loss: 0.1794\n",
      "3/15, train_loss: 0.1220\n",
      "4/15, train_loss: 0.2521\n",
      "5/15, train_loss: 0.1233\n",
      "6/15, train_loss: 0.1701\n",
      "7/15, train_loss: 0.1611\n",
      "8/15, train_loss: 0.1525\n",
      "9/15, train_loss: 0.1477\n",
      "10/15, train_loss: 0.1401\n",
      "11/15, train_loss: 0.1419\n",
      "12/15, train_loss: 0.1920\n",
      "13/15, train_loss: 0.1945\n",
      "14/15, train_loss: 0.1295\n",
      "15/15, train_loss: 0.2215\n",
      "epoch 164 average loss: 0.1649\n",
      "----------\n",
      "epoch 165/600\n",
      "1/15, train_loss: 0.1536\n",
      "2/15, train_loss: 0.1202\n",
      "3/15, train_loss: 0.1736\n",
      "4/15, train_loss: 0.1396\n",
      "5/15, train_loss: 0.1377\n",
      "6/15, train_loss: 0.3204\n",
      "7/15, train_loss: 0.1755\n",
      "8/15, train_loss: 0.1266\n",
      "9/15, train_loss: 0.1493\n",
      "10/15, train_loss: 0.1075\n",
      "11/15, train_loss: 0.2070\n",
      "12/15, train_loss: 0.1777\n",
      "13/15, train_loss: 0.1174\n",
      "14/15, train_loss: 0.1568\n",
      "15/15, train_loss: 0.2122\n",
      "epoch 165 average loss: 0.1650\n",
      "saved new best metric model at the 165th epoch\n",
      "current epoch: 165 current mean dice: 0.7788 \n",
      "best mean dice: 0.7788  at epoch: 165\n",
      "----------\n",
      "epoch 166/600\n",
      "1/15, train_loss: 0.1757\n",
      "2/15, train_loss: 0.1443\n",
      "3/15, train_loss: 0.1328\n",
      "4/15, train_loss: 0.1225\n",
      "5/15, train_loss: 0.1413\n",
      "6/15, train_loss: 0.2521\n",
      "7/15, train_loss: 0.1399\n",
      "8/15, train_loss: 0.1255\n",
      "9/15, train_loss: 0.1255\n",
      "10/15, train_loss: 0.1538\n",
      "11/15, train_loss: 0.2130\n",
      "12/15, train_loss: 0.1237\n",
      "13/15, train_loss: 0.1651\n",
      "14/15, train_loss: 0.2124\n",
      "15/15, train_loss: 0.1771\n",
      "epoch 166 average loss: 0.1603\n",
      "----------\n",
      "epoch 167/600\n",
      "1/15, train_loss: 0.1635\n",
      "2/15, train_loss: 0.1101\n",
      "3/15, train_loss: 0.1480\n",
      "4/15, train_loss: 0.2381\n",
      "5/15, train_loss: 0.1229\n",
      "6/15, train_loss: 0.1181\n",
      "7/15, train_loss: 0.1281\n",
      "8/15, train_loss: 0.1296\n",
      "9/15, train_loss: 0.1524\n",
      "10/15, train_loss: 0.1730\n",
      "11/15, train_loss: 0.1424\n",
      "12/15, train_loss: 0.1180\n",
      "13/15, train_loss: 0.1063\n",
      "14/15, train_loss: 0.2519\n",
      "15/15, train_loss: 0.1638\n",
      "epoch 167 average loss: 0.1511\n",
      "----------\n",
      "epoch 168/600\n",
      "1/15, train_loss: 0.1307\n",
      "2/15, train_loss: 0.1319\n",
      "3/15, train_loss: 0.1390\n",
      "4/15, train_loss: 0.1086\n",
      "5/15, train_loss: 0.1586\n",
      "6/15, train_loss: 0.1031\n",
      "7/15, train_loss: 0.1713\n",
      "8/15, train_loss: 0.1564\n",
      "9/15, train_loss: 0.1152\n",
      "10/15, train_loss: 0.1534\n",
      "11/15, train_loss: 0.1377\n",
      "12/15, train_loss: 0.1522\n",
      "13/15, train_loss: 0.3121\n",
      "14/15, train_loss: 0.1472\n",
      "15/15, train_loss: 0.1264\n",
      "epoch 168 average loss: 0.1496\n",
      "----------\n",
      "epoch 169/600\n",
      "1/15, train_loss: 0.1893\n",
      "2/15, train_loss: 0.1020\n",
      "3/15, train_loss: 0.1326\n",
      "4/15, train_loss: 0.1914\n",
      "5/15, train_loss: 0.1443\n",
      "6/15, train_loss: 0.1003\n",
      "7/15, train_loss: 0.1191\n",
      "8/15, train_loss: 0.1105\n",
      "9/15, train_loss: 0.1583\n",
      "10/15, train_loss: 0.2202\n",
      "11/15, train_loss: 0.2774\n",
      "12/15, train_loss: 0.1222\n",
      "13/15, train_loss: 0.1376\n",
      "14/15, train_loss: 0.1256\n",
      "15/15, train_loss: 0.1195\n",
      "epoch 169 average loss: 0.1500\n",
      "----------\n",
      "epoch 170/600\n",
      "1/15, train_loss: 0.1797\n",
      "2/15, train_loss: 0.1323\n",
      "3/15, train_loss: 0.1233\n",
      "4/15, train_loss: 0.1450\n",
      "5/15, train_loss: 0.2519\n",
      "6/15, train_loss: 0.1447\n",
      "7/15, train_loss: 0.1329\n",
      "8/15, train_loss: 0.1537\n",
      "9/15, train_loss: 0.1423\n",
      "10/15, train_loss: 0.1256\n",
      "11/15, train_loss: 0.1547\n",
      "12/15, train_loss: 0.1096\n",
      "13/15, train_loss: 0.1251\n",
      "14/15, train_loss: 0.1100\n",
      "15/15, train_loss: 0.1824\n",
      "epoch 170 average loss: 0.1475\n"
     ]
    }
   ],
   "source": [
    "root_dir = '/mnt/datawow/liuyiquan/trained_model'\n",
    "max_epochs = 600\n",
    "val_interval = 5\n",
    "best_metric = -1\n",
    "best_metric_epoch = -1\n",
    "epoch_loss_values = []\n",
    "metric_values = []\n",
    "post_pred = Compose([AsDiscrete(argmax=True, to_onehot=num_classes)])\n",
    "post_label = Compose([AsDiscrete(to_onehot=num_classes)])\n",
    "roi_size = crop_size\n",
    "slice_to_track = 30\n",
    "\n",
    "for epoch in range(max_epochs):\n",
    "    print(\"-\" * 10)\n",
    "    print(f\"epoch {epoch + 1}/{max_epochs}\")\n",
    "    model.train()\n",
    "    epoch_loss = 0\n",
    "    step = 0\n",
    "    for batch_data in train_loader:\n",
    "        step += 1\n",
    "        inputs, labels = (\n",
    "            batch_data[\"image\"].to(device),\n",
    "            batch_data[\"label\"].to(device),\n",
    "        )\n",
    "        \n",
    "        optimizer.zero_grad()\n",
    "        outputs = model(inputs)\n",
    "        loss = loss_function(outputs, labels)\n",
    "        loss.backward()\n",
    "        optimizer.step()\n",
    "        epoch_loss += loss.item()\n",
    "        print(f\"{step}/{len(train_ds) // train_loader.batch_size}, \" f\"train_loss: {loss.item():.4f}\")\n",
    "        # track batch loss metric\n",
    "        # aim_run.track(loss.item(), name=\"batch_loss\", context={\"type\": loss_type})\n",
    "\n",
    "    epoch_loss /= step\n",
    "    epoch_loss_values.append(epoch_loss)\n",
    "\n",
    "    # track epoch loss metric\n",
    "    # aim_run.track(epoch_loss, name=\"epoch_loss\", context={\"type\": loss_type})\n",
    "\n",
    "    print(f\"epoch {epoch + 1} average loss: {epoch_loss:.4f}\")\n",
    "\n",
    "    if (epoch + 1) % val_interval == 0:\n",
    "        # if (epoch + 1) % val_interval * 2 == 0:\n",
    "        #     # track model params and gradients\n",
    "        #     track_params_dists(model, aim_run)\n",
    "        #     # THIS SEGMENT TAKES RELATIVELY LONG (Advise Against it)\n",
    "        #     track_gradients_dists(model, aim_run)\n",
    "\n",
    "        model.eval()\n",
    "        with torch.no_grad():\n",
    "            for index, val_data in enumerate(val_loader):\n",
    "                val_inputs, val_labels = (\n",
    "                    val_data[\"image\"].to(device),\n",
    "                    val_data[\"label\"].to(device),\n",
    "                )\n",
    "\n",
    "                sw_batch_size = 4\n",
    "                val_outputs = sliding_window_inference(val_inputs, roi_size, sw_batch_size, model)\n",
    "                # val_outputs = model(val_inputs)\n",
    "                # tracking input, label and output images with Aim\n",
    "                # output = torch.argmax(val_outputs, dim=1)[0, :, :, slice_to_track].float()\n",
    "\n",
    "                # aim_run.track(\n",
    "                #     aim.Image(val_inputs[0, 0, :, :, slice_to_track], caption=f\"Input Image: {index}\"),\n",
    "                #     name=\"validation\",\n",
    "                #     context={\"type\": \"input\"},\n",
    "                # )\n",
    "                # aim_run.track(\n",
    "                #     aim.Image(val_labels[0, 0, :, :, slice_to_track], caption=f\"Label Image: {index}\"),\n",
    "                #     name=\"validation\",\n",
    "                #     context={\"type\": \"label\"},\n",
    "                # )\n",
    "                # aim_run.track(\n",
    "                #     aim.Image(output, caption=f\"Predicted Label: {index}\"),\n",
    "                #     name=\"predictions\",\n",
    "                #     context={\"type\": \"labels\"},\n",
    "                # )\n",
    "\n",
    "                val_outputs = [post_pred(i) for i in decollate_batch(val_outputs)]\n",
    "                val_labels = [post_label(i) for i in decollate_batch(val_labels)]\n",
    "                # compute metric for current iteration\n",
    "                dice_metric(y_pred=val_outputs, y=val_labels)\n",
    "\n",
    "            # aggregate the final mean dice result\n",
    "            metric = dice_metric.aggregate().item()\n",
    "            # track val metric\n",
    "            # aim_run.track(metric, name=\"val_metric\", context={\"type\": loss_type})\n",
    "\n",
    "            # reset the status for next validation round\n",
    "            dice_metric.reset()\n",
    "\n",
    "            metric_values.append(metric)\n",
    "            if metric > best_metric:\n",
    "                best_metric = metric\n",
    "                best_metric_epoch = epoch + 1\n",
    "                torch.save(model.state_dict(), os.path.join(root_dir, f\"{model_name}_best_metric_model.pth\"))\n",
    "\n",
    "                best_model_log_message = f\"saved new best metric model at the {epoch+1}th epoch\"\n",
    "                # aim_run.track(aim.Text(best_model_log_message), name=\"best_model_log_message\", epoch=epoch + 1)\n",
    "                print(best_model_log_message)\n",
    "\n",
    "            message1 = f\"current epoch: {epoch + 1} current mean dice: {metric:.4f}\"\n",
    "            message2 = f\"\\nbest mean dice: {best_metric:.4f} \"\n",
    "            message3 = f\"at epoch: {best_metric_epoch}\"\n",
    "\n",
    "            # aim_run.track(aim.Text(message1 + \"\\n\" + message2 + message3), name=\"epoch_summary\", epoch=epoch + 1)\n",
    "            print(message1, message2, message3)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 14,
   "id": "1a157a6d-8c37-44a0-903b-c9128b834958",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "/mnt/datawow/liuyiquan/trained_model/cardicUDA_UNet_best_metric_model.pth  loaded\n"
     ]
    }
   ],
   "source": [
    "model_path = os.path.join(root_dir, f\"{model_name}_best_metric_model.pth\")\n",
    "checkpoint = torch.load(model_path)\n",
    "model.load_state_dict(checkpoint)\n",
    "model.eval()\n",
    "print(model_path, ' loaded')"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 16,
   "id": "7a5a659b-90ae-4e4f-8bf1-7fc094875b33",
   "metadata": {},
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "67it [00:11,  6.03it/s]"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "current epoch: 405 current mean dice: 0.8150 \n",
      "best mean dice: 0.8356  at epoch: 365\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "\n"
     ]
    }
   ],
   "source": [
    "from tqdm import tqdm\n",
    "with torch.no_grad():\n",
    "    for index, val_data in tqdm(enumerate(val_loader)):\n",
    "        val_inputs, val_labels = (\n",
    "            val_data[\"image\"].to(device),\n",
    "            val_data[\"label\"].to(device),\n",
    "        )\n",
    "\n",
    "        sw_batch_size = 4\n",
    "        val_outputs = sliding_window_inference(val_inputs, roi_size, sw_batch_size, model)\n",
    "        val_outputs = [post_pred(i) for i in decollate_batch(val_outputs)]\n",
    "        val_labels = [post_label(i) for i in decollate_batch(val_labels)]\n",
    "        # compute metric for current iteration\n",
    "        dice_metric(y_pred=val_outputs, y=val_labels)\n",
    "\n",
    "    # aggregate the final mean dice result\n",
    "    metric = dice_metric.aggregate().item()\n",
    "    # track val metric\n",
    "    # aim_run.track(metric, name=\"val_metric\", context={\"type\": loss_type})\n",
    "\n",
    "    # reset the status for next validation round\n",
    "    dice_metric.reset()\n",
    "\n",
    "    metric_values.append(metric)\n",
    "\n",
    "    message1 = f\"current epoch: {epoch + 1} current mean dice: {metric:.4f}\"\n",
    "    message2 = f\"\\nbest mean dice: {best_metric:.4f} \"\n",
    "    message3 = f\"at epoch: {best_metric_epoch}\"\n",
    "\n",
    "    # aim_run.track(aim.Text(message1 + \"\\n\" + message2 + message3), name=\"epoch_summary\", epoch=epoch + 1)\n",
    "    print(message1, message2, message3)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "4705932a-e5bf-4dc1-911a-e22928035da4",
   "metadata": {},
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "code",
   "execution_count": 13,
   "id": "df84c9fe-4952-4371-914d-b6168ea7daa8",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "11"
      ]
     },
     "execution_count": 13,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "11"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 39,
   "id": "c8a51570-08a3-424c-9ac9-aa4383eb0bc1",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "/mnt/datawow/lyq/dataset/cardiacUDC_dataset/Site_G_20/patient-15-4_label.nii.gz (800, 600) (800, 600) 48 (array([0, 1, 2, 3, 4], dtype=int8), array([420255,   9754,   6869,  19722,  23400])) (array([0, 1, 3], dtype=int8), array([450524,   9754,  19722]))\n",
      "/mnt/datawow/lyq/dataset/cardiacUDC_dataset/Site_G_20/patient-8-4_label.nii.gz (800, 600) (800, 600) 45 (array([0, 1, 2, 3, 4], dtype=int8), array([411800,  29566,   7997,  16932,  13705])) (array([0, 1, 3], dtype=int8), array([433502,  29566,  16932]))\n",
      "/mnt/datawow/lyq/dataset/cardiacUDC_dataset/Site_G_20/patient-1-4_label.nii.gz (800, 600) (800, 600) 50 (array([0, 1, 2, 3, 4], dtype=int8), array([441193,  20859,   4953,   8045,   4950])) (array([0, 1, 3], dtype=int8), array([451096,  20859,   8045]))\n",
      "/mnt/datawow/lyq/dataset/cardiacUDC_dataset/Site_G_20/patient-20-4_label.nii.gz (800, 600) (800, 600) 47 (array([0, 1, 2, 3, 4], dtype=int8), array([409308,  13762,   8003,  21316,  27611])) (array([0, 1, 3], dtype=int8), array([444922,  13762,  21316]))\n",
      "/mnt/datawow/lyq/dataset/cardiacUDC_dataset/Site_G_20/patient-7-4_label.nii.gz (800, 600) (800, 600) 57 (array([0, 1, 2, 3, 4], dtype=int8), array([404779,  23609,  18053,  16668,  16891])) (array([0, 1, 3], dtype=int8), array([439723,  23609,  16668]))\n",
      "/mnt/datawow/lyq/dataset/cardiacUDC_dataset/Site_G_20/patient-21-4_label.nii.gz (800, 600) (800, 600) 53 (array([0, 1, 2, 3, 4], dtype=int8), array([423920,   5644,   6793,  22046,  21597])) (array([0, 1, 3], dtype=int8), array([452310,   5644,  22046]))\n",
      "/mnt/datawow/lyq/dataset/cardiacUDC_dataset/Site_G_20/patient-4-4_label.nii.gz (800, 600) (800, 600) 70 (array([0, 1, 2, 3, 4], dtype=int8), array([416619,  17573,  17305,  16097,  12406])) (array([0, 1, 3], dtype=int8), array([446330,  17573,  16097]))\n",
      "/mnt/datawow/lyq/dataset/cardiacUDC_dataset/Site_G_20/patient-13-4_label.nii.gz (800, 600) (800, 600) 59 (array([0, 1, 2, 3, 4], dtype=int8), array([408655,  27790,  11250,  14066,  18239])) (array([0, 1, 3], dtype=int8), array([438144,  27790,  14066]))\n",
      "/mnt/datawow/lyq/dataset/cardiacUDC_dataset/Site_G_20/patient-16-4_label.nii.gz (800, 600) (800, 600) 48 (array([0, 1, 2, 3, 4], dtype=int8), array([421659,  30272,   5287,  11623,  11159])) (array([0, 1, 3], dtype=int8), array([438105,  30272,  11623]))\n",
      "/mnt/datawow/lyq/dataset/cardiacUDC_dataset/Site_G_20/patient-17-4_label.nii.gz (800, 600) (800, 600) 60 (array([0, 1, 2, 3, 4], dtype=int8), array([407668,  29239,  15723,  17243,  10127])) (array([0, 1, 3], dtype=int8), array([433518,  29239,  17243]))\n",
      "/mnt/datawow/lyq/dataset/cardiacUDC_dataset/Site_G_20/patient-12-4_label.nii.gz (800, 600) (800, 600) 43 (array([0, 1, 2, 3, 4], dtype=int8), array([432600,   8876,   4325,  10647,  23552])) (array([0, 1, 3], dtype=int8), array([460477,   8876,  10647]))\n",
      "/mnt/datawow/lyq/dataset/cardiacUDC_dataset/Site_G_20/patient-19-4_label.nii.gz (800, 600) (800, 600) 36 (array([0, 1, 2, 3, 4], dtype=int8), array([400022,  15328,   6965,  35317,  22368])) (array([0, 1, 3], dtype=int8), array([429355,  15328,  35317]))\n",
      "/mnt/datawow/lyq/dataset/cardiacUDC_dataset/Site_G_20/patient-2-4_label.nii.gz (800, 600) (800, 600) 47 (array([0, 1, 2, 3, 4], dtype=int8), array([403429,  26770,  12765,  16947,  20089])) (array([0, 1, 3], dtype=int8), array([436283,  26770,  16947]))\n",
      "/mnt/datawow/lyq/dataset/cardiacUDC_dataset/Site_G_20/patient-9-4_label.nii.gz (800, 600) (800, 600) 36 (array([0, 1, 2, 3, 4], dtype=int8), array([402282,  15744,   5851,  29176,  26947])) (array([0, 1, 3], dtype=int8), array([435080,  15744,  29176]))\n",
      "/mnt/datawow/lyq/dataset/cardiacUDC_dataset/Site_G_20/patient-11-4_label.nii.gz (800, 600) (800, 600) 53 (array([0, 1, 2, 3, 4], dtype=int8), array([410867,  24952,  10364,  13964,  19853])) (array([0, 1, 3], dtype=int8), array([441084,  24952,  13964]))\n"
     ]
    },
    {
     "ename": "KeyboardInterrupt",
     "evalue": "",
     "output_type": "error",
     "traceback": [
      "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m",
      "\u001b[0;31mKeyboardInterrupt\u001b[0m                         Traceback (most recent call last)",
      "Cell \u001b[0;32mIn[39], line 4\u001b[0m\n\u001b[1;32m      2\u001b[0m img_path \u001b[38;5;241m=\u001b[39m f\u001b[38;5;241m.\u001b[39mreplace(\u001b[38;5;124m'\u001b[39m\u001b[38;5;124mlabel\u001b[39m\u001b[38;5;124m'\u001b[39m,\u001b[38;5;124m'\u001b[39m\u001b[38;5;124mimage\u001b[39m\u001b[38;5;124m'\u001b[39m)\n\u001b[1;32m      3\u001b[0m image \u001b[38;5;241m=\u001b[39m np\u001b[38;5;241m.\u001b[39marray(nib\u001b[38;5;241m.\u001b[39mload(img_path)\u001b[38;5;241m.\u001b[39mdataobj)\n\u001b[0;32m----> 4\u001b[0m mask  \u001b[38;5;241m=\u001b[39m \u001b[43mnp\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43marray\u001b[49m\u001b[43m(\u001b[49m\u001b[43mnib\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mload\u001b[49m\u001b[43m(\u001b[49m\u001b[43mf\u001b[49m\u001b[43m)\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mdataobj\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m      5\u001b[0m mask_frames_ \u001b[38;5;241m=\u001b[39m np\u001b[38;5;241m.\u001b[39msum(mask, axis\u001b[38;5;241m=\u001b[39m(\u001b[38;5;241m0\u001b[39m,\u001b[38;5;241m1\u001b[39m))\n\u001b[1;32m      6\u001b[0m mask_frames_ \u001b[38;5;241m=\u001b[39m np\u001b[38;5;241m.\u001b[39mwhere(mask_frames_ \u001b[38;5;241m>\u001b[39m \u001b[38;5;241m100\u001b[39m, \u001b[38;5;241m1\u001b[39m, \u001b[38;5;241m0\u001b[39m)\n",
      "File \u001b[0;32m~/.local/lib/python3.10/site-packages/nibabel/arrayproxy.py:457\u001b[0m, in \u001b[0;36mArrayProxy.__array__\u001b[0;34m(self, dtype)\u001b[0m\n\u001b[1;32m    436\u001b[0m \u001b[38;5;28;01mdef\u001b[39;00m \u001b[38;5;21m__array__\u001b[39m(\u001b[38;5;28mself\u001b[39m, dtype\u001b[38;5;241m=\u001b[39m\u001b[38;5;28;01mNone\u001b[39;00m):\n\u001b[1;32m    437\u001b[0m \u001b[38;5;250m    \u001b[39m\u001b[38;5;124;03m\"\"\"Read data from file and apply scaling, casting to ``dtype``\u001b[39;00m\n\u001b[1;32m    438\u001b[0m \n\u001b[1;32m    439\u001b[0m \u001b[38;5;124;03m    If ``dtype`` is unspecified, the dtype of the returned array is the\u001b[39;00m\n\u001b[0;32m   (...)\u001b[0m\n\u001b[1;32m    455\u001b[0m \u001b[38;5;124;03m        Scaled image data with type `dtype`.\u001b[39;00m\n\u001b[1;32m    456\u001b[0m \u001b[38;5;124;03m    \"\"\"\u001b[39;00m\n\u001b[0;32m--> 457\u001b[0m     arr \u001b[38;5;241m=\u001b[39m \u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43m_get_scaled\u001b[49m\u001b[43m(\u001b[49m\u001b[43mdtype\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mdtype\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mslicer\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43m(\u001b[49m\u001b[43m)\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m    458\u001b[0m     \u001b[38;5;28;01mif\u001b[39;00m dtype \u001b[38;5;129;01mis\u001b[39;00m \u001b[38;5;129;01mnot\u001b[39;00m \u001b[38;5;28;01mNone\u001b[39;00m:\n\u001b[1;32m    459\u001b[0m         arr \u001b[38;5;241m=\u001b[39m arr\u001b[38;5;241m.\u001b[39mastype(dtype, copy\u001b[38;5;241m=\u001b[39m\u001b[38;5;28;01mFalse\u001b[39;00m)\n",
      "File \u001b[0;32m~/.local/lib/python3.10/site-packages/nibabel/arrayproxy.py:424\u001b[0m, in \u001b[0;36mArrayProxy._get_scaled\u001b[0;34m(self, dtype, slicer)\u001b[0m\n\u001b[1;32m    422\u001b[0m     scl_inter \u001b[38;5;241m=\u001b[39m scl_inter\u001b[38;5;241m.\u001b[39mastype(use_dtype)\n\u001b[1;32m    423\u001b[0m \u001b[38;5;66;03m# Read array and upcast as necessary for big slopes, intercepts\u001b[39;00m\n\u001b[0;32m--> 424\u001b[0m scaled \u001b[38;5;241m=\u001b[39m apply_read_scaling(\u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43m_get_unscaled\u001b[49m\u001b[43m(\u001b[49m\u001b[43mslicer\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mslicer\u001b[49m\u001b[43m)\u001b[49m, scl_slope, scl_inter)\n\u001b[1;32m    425\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m dtype \u001b[38;5;129;01mis\u001b[39;00m \u001b[38;5;129;01mnot\u001b[39;00m \u001b[38;5;28;01mNone\u001b[39;00m:\n\u001b[1;32m    426\u001b[0m     scaled \u001b[38;5;241m=\u001b[39m scaled\u001b[38;5;241m.\u001b[39mastype(np\u001b[38;5;241m.\u001b[39mpromote_types(scaled\u001b[38;5;241m.\u001b[39mdtype, dtype), copy\u001b[38;5;241m=\u001b[39m\u001b[38;5;28;01mFalse\u001b[39;00m)\n",
      "File \u001b[0;32m~/.local/lib/python3.10/site-packages/nibabel/arrayproxy.py:394\u001b[0m, in \u001b[0;36mArrayProxy._get_unscaled\u001b[0;34m(self, slicer)\u001b[0m\n\u001b[1;32m    390\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m canonical_slicers(slicer, \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_shape, \u001b[38;5;28;01mFalse\u001b[39;00m) \u001b[38;5;241m==\u001b[39m canonical_slicers(\n\u001b[1;32m    391\u001b[0m     (), \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_shape, \u001b[38;5;28;01mFalse\u001b[39;00m\n\u001b[1;32m    392\u001b[0m ):\n\u001b[1;32m    393\u001b[0m     \u001b[38;5;28;01mwith\u001b[39;00m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_get_fileobj() \u001b[38;5;28;01mas\u001b[39;00m fileobj, \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_lock:\n\u001b[0;32m--> 394\u001b[0m         \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[43marray_from_file\u001b[49m\u001b[43m(\u001b[49m\n\u001b[1;32m    395\u001b[0m \u001b[43m            \u001b[49m\u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43m_shape\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m    396\u001b[0m \u001b[43m            \u001b[49m\u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43m_dtype\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m    397\u001b[0m \u001b[43m            \u001b[49m\u001b[43mfileobj\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m    398\u001b[0m \u001b[43m            \u001b[49m\u001b[43moffset\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43m_offset\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m    399\u001b[0m \u001b[43m            \u001b[49m\u001b[43morder\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43morder\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m    400\u001b[0m \u001b[43m            \u001b[49m\u001b[43mmmap\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43m_mmap\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m    401\u001b[0m \u001b[43m        \u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m    402\u001b[0m \u001b[38;5;28;01mwith\u001b[39;00m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_get_fileobj() \u001b[38;5;28;01mas\u001b[39;00m fileobj:\n\u001b[1;32m    403\u001b[0m     \u001b[38;5;28;01mreturn\u001b[39;00m fileslice(\n\u001b[1;32m    404\u001b[0m         fileobj,\n\u001b[1;32m    405\u001b[0m         slicer,\n\u001b[0;32m   (...)\u001b[0m\n\u001b[1;32m    410\u001b[0m         lock\u001b[38;5;241m=\u001b[39m\u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_lock,\n\u001b[1;32m    411\u001b[0m     )\n",
      "File \u001b[0;32m~/.local/lib/python3.10/site-packages/nibabel/volumeutils.py:464\u001b[0m, in \u001b[0;36marray_from_file\u001b[0;34m(shape, in_dtype, infile, offset, order, mmap)\u001b[0m\n\u001b[1;32m    462\u001b[0m infile\u001b[38;5;241m.\u001b[39mseek(offset)\n\u001b[1;32m    463\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m \u001b[38;5;28mhasattr\u001b[39m(infile, \u001b[38;5;124m'\u001b[39m\u001b[38;5;124mreadinto\u001b[39m\u001b[38;5;124m'\u001b[39m):\n\u001b[0;32m--> 464\u001b[0m     data_bytes \u001b[38;5;241m=\u001b[39m \u001b[38;5;28;43mbytearray\u001b[39;49m\u001b[43m(\u001b[49m\u001b[43mn_bytes\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m    465\u001b[0m     n_read \u001b[38;5;241m=\u001b[39m infile\u001b[38;5;241m.\u001b[39mreadinto(data_bytes)\n\u001b[1;32m    466\u001b[0m     needs_copy \u001b[38;5;241m=\u001b[39m \u001b[38;5;28;01mFalse\u001b[39;00m\n",
      "\u001b[0;31mKeyboardInterrupt\u001b[0m: "
     ]
    }
   ],
   "source": [
    "for f in files:\n",
    "    img_path = f.replace('label','image')\n",
    "    image = np.array(nib.load(img_path).dataobj)\n",
    "    mask  = np.array(nib.load(f).dataobj)\n",
    "    mask_frames_ = np.sum(mask, axis=(0,1))\n",
    "    mask_frames_ = np.where(mask_frames_ > 100, 1, 0)\n",
    "    mask_frames_ = np.argwhere(mask_frames_ == 1)\n",
    "    select_index = random.choice(mask_frames_)[0]\n",
    "    selected_image = image[:, :, select_index]\n",
    "    selected_mask = mask[:, :, select_index]\n",
    "    value_list = [1,3]\n",
    "    result = np.where(np.isin(selected_mask, value_list), selected_mask, 0)\n",
    "\n",
    "    print(f, selected_image.shape, selected_mask.shape, select_index, np.unique(selected_mask,return_counts=True), np.unique(result,return_counts=True))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 34,
   "id": "09d551a3-08db-49d1-9732-7f5ce9470240",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "<matplotlib.image.AxesImage at 0x7f6750d7ca00>"
      ]
     },
     "execution_count": 34,
     "metadata": {},
     "output_type": "execute_result"
    },
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAAU0AAAGiCAYAAABj4pSTAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjguNCwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8fJSN1AAAACXBIWXMAAA9hAAAPYQGoP6dpAAEAAElEQVR4nOz9WYyt6VneD/+e6R3WWNPetXd377abtrHdZrBiiN3/5MufEAcnsVAQPgAJgROhICEbCZwQYokQhiSOOCFBMXCCbA5ikY9IJIpDDMYokA9sAw5OjLEdA7a72917qmGN7/g8z3dwv2vV3j3YXT1t2/1eUql7V61aU1Vd7/3c93Vfl4oxRnr06NGjx9OCvtNPoEePHj2+ktCTZo8ePXqcAz1p9ujRo8c50JNmjx49epwDPWn26NGjxznQk2aPHj16nAM9afbo0aPHOdCTZo8ePXqcAz1p9ujRo8c50JNmjx49epwDd5Q03/Wud/HSl76ULMt43etexx/+4R/eyafTo0ePHl8Sd4w0/+N//I+8/e1v51/8i3/B//pf/4tv/MZv5I1vfCPXr1+/U0+pR48ePb4k1J0y7Hjd617HN3/zN/Pv//2/ByCEwJUrV/ihH/oh/tk/+2d34in16NGjx5eEvRMPWtc1H/3oR3nHO96x/ZzWmje84Q186EMfesLtq6qiqqrtv0MIHB8fs7+/j1LqBXnOPXr0+OpFjJHFYsFdd92F1l/8AH5HSPPmzZt47zk8PLzt84eHh3zqU596wu3f+c538lM/9VMv1NPr0aPHixQPP/ww99xzzxe9zR0hzfPiHe94B29/+9u3/57NZtx77738df4eFncHn1mPHj2+GtDS8P/jNxiPx1/ytneENA8ODjDGcO3atds+f+3aNS5duvSE26dpSpqmT/i8xWFVT5o9evR4lugmO0+n3XdHpudJkvDa176WD37wg9vPhRD44Ac/yIMPPngnnlKPHj16PC3cseP529/+dt7ylrfwTd/0TfzVv/pX+bf/9t+yWq34h//wH96pp9SjR48eXxJ3jDS/67u+ixs3bvATP/ETXL16lde85jW8//3vf8JwqEePHj2+nHDHdJrPBvP5nOl0yrfw9/ueZo8ePZ412tjwP/gvzGYzJpPJF71tv3veo0ePHudAT5o9evTocQ70pNmjR48e50BPmj169OhxDvSk2aNHjx7nQE+aPXr06HEO9KTZo0ePHudAT5o9evTocQ70pNmjR48e50BPmj169OhxDvSk2aNHjx7nQE+aPXr06HEO9KTZo0ePHudAT5o9evTocQ70pNmjR48e50BPmj169OhxDvSk2aNHjx7nQE+aPXr06HEO9KTZo0ePHudAT5o9evTocQ70pNmjR48e50BPmj169OhxDvSk2aNHjx7nQE+aPXr06HEO9KTZo0ePHudAT5o9evTocQ70pNmjR48e50BPmj169OhxDvSk2aNHjx7nQE+aPXr06HEO9KTZo0ePHudAT5o9evTocQ70pNmjR48e50BPmj169OhxDvSk2aNHjx7nwLlJ8/d+7/f49m//du666y6UUvzn//yfb/t6jJGf+Imf4PLly+R5zhve8AY+85nP3Hab4+Njvud7vofJZMLOzg7f//3fz3K5fFYvpEePHj1eCJybNFerFd/4jd/Iu971rif9+s/+7M/y8z//8/zSL/0SH/nIRxgOh7zxjW+kLMvtbb7ne76HT3ziE3zgAx/gfe97H7/3e7/HD/zADzzzV9GjR48eLxBUjDE+429Wil//9V/nO77jOwCpMu+66y7+8T/+x/yTf/JPAJjNZhweHvKe97yH7/7u7+aTn/wkDzzwAH/0R3/EN33TNwHw/ve/n7/39/4ejzzyCHfdddeXfNz5fM50OuVb+PtY5Z7p0+/Ro0cPANrY8D/4L8xmMyaTyRe97XPa0/zsZz/L1atXecMb3rD93HQ65XWvex0f+tCHAPjQhz7Ezs7OljAB3vCGN6C15iMf+ciT3m9VVczn89s+evTo0eNO4DklzatXrwJweHh42+cPDw+3X7t69SoXL1687evWWvb29ra3eTze+c53Mp1Otx9Xrlx5Lp92jx49ejxtfEVMz9/xjncwm822Hw8//PCdfko9evR4keI5Jc1Lly4BcO3atds+f+3ate3XLl26xPXr12/7etu2HB8fb2/zeKRpymQyue2jR48ePe4EnlPSvO+++7h06RIf/OAHt5+bz+d85CMf4cEHHwTgwQcf5PT0lI9+9KPb2/zO7/wOIQRe97rXPZdPp0ePHj2ec9jzfsNyueTP//zPt//+7Gc/y8c+9jH29va49957+eEf/mH+5b/8l7z85S/nvvvu45//83/OXXfdtZ2wv+pVr+Lv/J2/wz/6R/+IX/qlX6Jp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",
      "text/plain": [
       "<Figure size 640x480 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "plt.imshow(selected_image)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 33,
   "id": "f0216759-065a-41fa-a17a-9f7030e48d7e",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "<matplotlib.image.AxesImage at 0x7f6751aabd30>"
      ]
     },
     "execution_count": 33,
     "metadata": {},
     "output_type": "execute_result"
    },
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAAU0AAAGiCAYAAABj4pSTAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjguNCwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8fJSN1AAAACXBIWXMAAA9hAAAPYQGoP6dpAABAd0lEQVR4nO3deXxU5b0/8M+ZNetM9pmELARZQtjUgGGqViuRiNGrNfaqRUyVK1caqICicqu4tBV/9LYudaG1FuxVpGLFBQVFFFAJWwAJAcIWSIDMJJBkJgnJZGbO8/sDMhJlyUlmMjPh83695lVyzjNzvkPjh+ec5znPkYQQAkRE1CWqQBdARBRKGJpERAowNImIFGBoEhEpwNAkIlKAoUlEpABDk4hIAYYmEZECDE0iIgUYmkRECgQ0NF955RX0798fYWFhyM3NxaZNmwJZDhHRBQUsNP/1r39h1qxZePLJJ7F161aMGjUK+fn5qK2tDVRJREQXJAVqwY7c3FyMGTMGL7/8MgBAlmWkpaVh+vTpeOyxxwJREhHRBWkCcdD29naUlpZizpw53m0qlQp5eXkoKSn5UXun0wmn0+n9WZZl1NfXIz4+HpIk9UrNRNR3CSHQ1NSElJQUqFTnPwEPSGgeP34cHo8HJpOp03aTyYQ9e/b8qP28efPw9NNP91Z5RHSRqq6uRmpq6nnbBCQ0lZozZw5mzZrl/dlutyM9PR1X4UZooA1gZUTUF7jhwjf4FNHR0RdsG5DQTEhIgFqths1m67TdZrPBbDb/qL1er4der//Rdg200EgMTSLqodMjO1253BeQ0XOdToecnBysXr3au02WZaxevRoWiyUQJRERdUnATs9nzZqFoqIijB49GldccQVeeOEFtLS04N577w1USUREFxSw0LzjjjtQV1eHuXPnwmq14tJLL8XKlSt/NDhERBRMAjZPsyccDgeMRiOuxS28pklEPeYWLqzBh7Db7TAYDOdty3vPiYgUYGgSESnA0CQiUoChSUSkAEOTiEgBhiYRkQIMTSIiBRiaREQKMDSJiBRgaBIRKcDQJCJSgKFJRKQAQ5OISAGGJhGRAgxNIiIFGJpERAowNImIFGBoEhEpwNAkIlKAoUlEpABDk4hIAYYmEZECDE0iIgUYmkRECjA0iYgUYGgSESnA0CQiUoChSUSkAEOTiEgBhiYRkQIMTSIiBRiaREQKMDSJiBRgaBIRKcDQJCJSQHForlu3DjfffDNSUlIgSRI++OCDTvuFEJg7dy6Sk5MRHh6OvLw87Nu3r1Ob+vp6TJw4EQaDATExMZg8eTKam5t79EWIiHqD4tBsaWnBqFGj8Morr5x1//z58/HSSy9hwYIF2LhxIyIjI5Gfn4+2tjZvm4kTJ6K8vByrVq3C8uXLsW7dOkyZMqX734KIqJdIQgjR7TdLEpYtW4Zbb70VwKleZkpKCh566CE8/PDDAAC73Q6TyYRFixbhzjvvxO7du5GdnY3Nmzdj9OjRAICVK1fixhtvxJEjR5CSknLB4zocDhiNRlyLW6CRtN0tn4gIAOAWLqzBh7Db7TAYDOdt69NrmpWVlbBarcjLy/NuMxqNyM3NRUlJCQCgpKQEMTEx3sAEgLy8PKhUKmzcuPGsn+t0OuFwODq9iIgCwaehabVaAQAmk6nTdpPJ5N1ntVqRlJTUab9Go0FcXJy3zQ/NmzcPRqPR+0pLS/Nl2UREXRYSo+dz5syB3W73vqqrqwNdEhFdpHwammazGQBgs9k6bbfZbN59ZrMZtbW1nfa73W7U19d72/yQXq+HwWDo9CIiCgSfhmZmZibMZjNWr17t3eZwOLBx40ZYLBYAgMViQWNjI0pLS71tvvzyS8iyjNzcXF+WQ0Tkcxqlb2hubsb+/fu9P1dWVmL79u2Ii4tDeno6ZsyYgd///vcYNGgQMjMz8cQTTyAlJcU7wj506FDccMMNuP/++7FgwQK4XC5MmzYNd955Z5dGzomIAklxaG7ZsgU/+9nPvD/PmjULAFBUVIRFixbhkUceQUtLC6ZMmYLGxkZcddVVWLlyJcLCwrzvefvttzFt2jSMGzcOKpUKhYWFeOmll3zwdYiI/KtH8zQDhfM0iciXAjZPk4ior2NoEhEpwNAkIlKAoUlEpABDk4hIAYYmEZECDE0iIgUYmkRECjA0iYgUYGgSESnA0CQiUoChSUSkAEOTiEgBhiYRkQIMTSIiBRiaREQKMDSJiBRgaBIRKcDQJCJSgKFJRKQAQ5OISAGGJhGRAgxNIiIFGJpERAowNImIFGBoEhEpwNAkIlKAoUlEpABDk4hIAYYmEZECDE0iIgUYmkRECjA0iYgUYGgSESnA0CQiUkBRaM6bNw9jxoxBdHQ0kpKScOutt6KioqJTm7a2NhQXFyM+Ph5RUVEoLCyEzWbr1KaqqgoFBQWIiIhAUlISZs+eDbfb3fNvQ0TkZ4pCc+3atSguLsaGDRuwatUquFwujB8/Hi0tLd42M2fOxMcff4ylS5di7dq1OHbsGG677Tbvfo/Hg4KCArS3t2P9+vV48803sWjRIsydO9d334qIyE8kIYTo7pvr6uqQlJSEtWvX4qc//SnsdjsSExOxePFi3H777QCAPXv2YOjQoSgpKcHYsWOxYsUK3HTTTTh27BhMJhMAYMGCBXj00UdRV1cHnU53weM6HA4YjUZci1ugkbTdLZ+ICADgFi6swYew2+0wGAznbduja5p2ux0AEBcXBwAoLS2Fy+VCXl6et01WVhbS09NRUlICACgpKcGIESO8gQkA+fn5cDgcKC8vP+txnE4nHA5HpxcRUSB0OzRlWcaMGTNw5ZVXYvjw4QAAq9UKnU6HmJiYTm1NJhOsVqu3zZmB2bG/Y9/ZzJs3D0aj0ftKS0vrbtlERD3S7dAsLi7Gzp07sWTJEl/Wc1Zz5syB3W73vqqrq/1+TCKis9F0503Tpk3D8uXLsW7dOqSmpnq3m81mtLe3o7GxsVNv02azwWw2e9ts2rSp0+d1jK53tPkhvV4PvV7fnVKJiHxKUU9TCIFp06Zh2bJl+PLLL5GZmdlpf05ODrRaLVavXu3dVlFRgaqqKlgsFgCAxWJBWVkZamtrvW1WrVoFg8GA7OzsnnwXIiK/U9TTLC4uxuLFi/Hhhx8iOjraew3SaDQiPDwcRqMRkydPxqxZsxAXFweDwYDp06fDYrFg7NixAIDx48cjOzsbkyZNwvz582G1WvH444+juLiYvUkiCnqKphxJknTW7QsXLsSvfvUrAKcmtz/00EN455134HQ6kZ+fj1dffbXTqffhw4cxdepUrFmzBpGRkSgqKsJzzz0HjaZrGc4pR0TkS0qmHPVonmagMDSJyJd6bZ4mEdHFhqFJRKQAQ5OISAGGJhGRAgxNIiIFGJpERAowNImIFGBoEhEpwNAkIlKAoUlEpABDk4hIAYYmEZECDE0iIgUYmkRECnTrcRdEfY4kQZ2QAEmvgystAdojJwBZBgC40xIgOT1QHaiGh09CvegxNOmip8lIQ9vAJLRFqCFrTi203Wru96N26uQhCKs5CXVjM+Tj9ZCbm4HQW46WeoihSRc1Tf90NA83Q9ae/akEZ/LoVWjpHwUgCmpnErQtbugO1MJ9zArIHv8XS0GBoUkXJUmrgzR0AJrTDV0KzB/y6FXw6HVwxvSDPjMJuspayMdPQG5r80O1FEwYmnTRkbQ6yFdkoy1RB3GO5151lVBJaEvQwRnXD6r2FIRXN0HetY89zz6MoUkXDVV0NFRxMXAOSES7UdPjwDyTUEnwhEloGWiAPn4kdPttcNfYGJ59EEOTfEOSIOl0kLIGwBUbjrrLws7ZNOy4QMK6I3Afru6d2lRqqEYOQWtKJGSd5NOw/CEhSXDGauEck4qIw7EQ3+1hcPYxDE3qPkmCdGk2mgZGoXGgGpAAZ7wMoQIA+Zxva04HGgen4pIlEfCUV/i3RI0GGDUELWmRfg3LM3Uc52RGJHQxo6A/XA+57gTkpqZeOT75F0OTFJO0OqjjY9F4dX/UjlFB1gqcLyTPxh0lcPCOOAx46xJ49h7wQ5ESNJkZaMuMhyta3WuBeSYhSXDGaOGMMUHtTET40WZgfxXklpZer4V8h6FJikiXDUPNT41oNQl4wgQgdX+eoitawPazJCRVHfXtqLMkQTUyC02Z0QEJy7Px6FVoyYyGNj4L+q374Wm0B7ok6iaGJl2QOjERTVcNgNOgQmMW4AlT1qs8n8YhAsarhkH7RalvPvB0YLYEUWB2EJIEl0EN91VDELmnDp79lYEuibqBoUk/oh6YibqrzZB1p35u6Qe4onrWqzwnCbCO1SNjY3TPr/kFcWB2EJIEoQVahiYiEmBwhiCGJgEAVJGRwKAM1I0xwj4Qp65T9lLuOONkiIHpwLby7n9ICATmmWSNhJahidAnGqDaugfC6Qx0SdRFDM2LnGZAf9T9NBnNqRKccbJ/epMX4oOMU1/SH80hEpgdZI2EVnMYovunwVOxP9DlUBcxNC9GKjVUkRFov2IwDl+jgytaAAjdhSfUsbFoHZgQUoF5pvZkA9T+nXlFPsTQvMiooqPhuCEbx0ep4AkXEKrQDUuvxDi4w0N3aVjJ7buBNfI/hubFQJKgMZvQOiIV1jE6tMfJfSMsAWjMJrQMjAt0Gd2mbXJDu+MgeM9Q6GBo9mGa1H5wDjShfqgeTRmA0AoIVd/p1ahjjGi5PB0efWj1MiUhAAHoG13QbjvAhY1DDEOzj5H0ekiDMlF/eSwahgIevZ+mCvmQyilB1dyqqLclaTRwD+0PWRc61zGl0wsWR1S3QFVVC8/x4/BwEeOQw9AMcZJGA4wYAuvVRnjCAFkNtCXKAHpvylBPGQ8on6+oTk3BSZM+ZAZ/JCGgcgpE7jgKd40NHi7iEbIYmiFI0migijGi+apLcHy4Bu1GAaEJzdNulVNC0tpaRT0uTVoqmoebQyYw1U4ZEYcdEJXVcJ88GehyqIcYmsFOpYbaEAUkxqM5OwEA0NRPg5MpAu4IAUihGZYdTvUyD3WtsUoNTb9ktIxM7tZq671NEgLqNoGI76rhrrEGuhzyEUVX0F977TWMHDkSBoMBBoMBFosFK1as8O5va2tDcXEx4uPjERUVhcLCQthstk6fUVVVhYKCAkRERCApKQmzZ8+G2+32zbfpA9QJ8dAkm6HJSEPzf45F/a+uwP5Hs7Hvv0w4eq0KR69VwTFIhjsydE6/z6Wjl9mV9SYlrQ4idziaLk+BRxfcAz+SENCc9CCqogH6r3YwMPsYRT3N1NRUPPfccxg0aBCEEHjzzTdxyy23YNu2bRg2bBhmzpyJTz75BEuXLoXRaMS0adNw22234dtvvwUAeDweFBQUwGw2Y/369aipqcE999wDrVaLZ5991i9fMJSohw3BgTvj4Dm9fq9QB/8gTndJMpCwQ3SplylpNJBHD0VbiFzD1B9vh3rzbnh4a2SfJAnRs+G7uLg4/PGPf8Ttt9+OxMRELF68GLfffjsAYM+ePRg6dChKSkowduxYrFixAjfddBOOHTsGk8kEAFiwYAEeffRR1NXVQafTdemYDocDRqMR1+IWaCRtT8oPCppkMxqu6Y8TI6RTp9x9nQCM+yQk/b0UwtV+3qZqgwHtOQN9/ngKf1C5BSIrTkCurL7g96Lg4hYurMGHsNvtMBgM523b7fMcj8eDJUuWoKWlBRaLBaWlpXC5XMjLy/O2ycrKQnp6OkpKSgAAJSUlGDFihDcwASA/Px8OhwPl5ederMHpdMLhcHR69RWSRoOaWzNhuwIXR2AC0DlUSP6s5oLBIml1cA/LDPrAlISAzuFGVJkVnr0HGJh9nOKBoLKyMlgsFrS1tSEqKgrLli1DdnY2tm/fDp1Oh5iYmE7tTSYTrNZT13SsVmunwOzY37HvXObNm4enn35aaakhQRo2CE2ZCPnrk10lyUDSFjfcBw+du41WB1X/VLRlxsEdoQruwJQFonaf6l26GZYXBcWhOWTIEGzfvh12ux3vvfceioqKsHbtWn/U5jVnzhzMmjXL+7PD4UBaWppfj9kbVMOzcPD2mNOPi+j7dA0qJK93Qvvl9rM3UKmhviQjZMJS2+RB2ME6uA9VBboc6kWKQ1On02HgwIEAgJycHGzevBkvvvgi7rjjDrS3t6OxsbFTb9Nms8FsNgMAzGYzNm3a1OnzOkbXO9qcjV6vh16vV1pqUNMM6I/9d8TCHXVxBKbkAdI/bwY27Dh7A5Ua0qgsNGf03gPQukuSBaL2NULeezCoZn5o0lIhx0ZB1dQKd+XhQJfTZ/V47oYsy3A6ncjJyYFWq8Xq1au9+yoqKlBVVQWLxQIAsFgsKCsrQ21trbfNqlWrYDAYkJ2d3dNSQoYqLAzWvOSLJjABINyqglS65+w7TwfmySAPTEkI6BtciC49Cs/ufRBBEJiaZDOOPfITHFuWjZs/24Y3P3kDk1auQ9XSEXAWjIGk7drgKnWdop7mnDlzMGHCBKSnp6OpqQmLFy/GmjVr8Nlnn8FoNGLy5MmYNWsW4uLiYDAYMH36dFgsFowdOxYAMH78eGRnZ2PSpEmYP38+rFYrHn/8cRQXF/e5nuT5uMZmozHr4glMyS0h5Zvmsw+QhEBgdtwzHnnQAbmsAu4guF9cbUpCddFA3D1pFR6O+xRqqaP/E4k7oxtw55X/h4axJ3HLromImqGBZ/e+gNbblygKzdraWtxzzz2oqamB0WjEyJEj8dlnn+H6668HADz//PNQqVQoLCyE0+lEfn4+Xn31Ve/71Wo1li9fjqlTp8JisSAyMhJFRUV45plnfPutgpgqOhpHLGEhfyfPBYlTo+ThVoGYgy5gY9mP24RIYHrv6rHagAAHpjoxEdX3DsLkok8xI/bz01vPfsIYq47AuhHLkPngFAyeKgW89r6ix/M0AyFU52mqDQbU3DMcjgFynx4tl2RA16hC5ltHz31tTZKgGjUULf2jgjYwAUDTKiN88wF4TtQHrAZVdDSkiHBUFw3E5KJPMT3m4Bk9ywtb1wbM+/ldkL/b7ccqQ5uSeZq897yXqMLCUDOp7wemyikh4TuB2BXlcJ/n2d7quFi0pDIwz0edEI+jE4fg5nu/xlVRm/Cz8E+gl7RQOhTx0zCgaGo0Bj/gnzovNgzN3iBJcI3NRlNm3w1MSQZi9py6l1w+eBie8wySSBoNPINSg3bRDZVLINzWCtX+I/A0NPTywdVQD8rE0RuTcHPR13gvYQUiVB2DOd0/q3pz/N8w79JfQt6+yzd1XsQYmr1AnZSIQ9frT91L3hcJIK5MQtw7W7t0v7U6PRVN5rBeKKzrTi2yISPsUANwogGe+oZeXyBYk9oPe55LwkdXvYpMjfp0WPpm9PunYUDRryMxeIpPPu6ixtDsBa2XpsMd3ncDM37HqcC80LO7JY0G0vDBaOkXXAM/khCIqmiAvP8wPAG4q0edEI+jdw/BbfeuwSeJnwAI98txbh+9BeUxRnjOc9mELoyh6WeSRoMTw3V9crRcc1JCxvKTUG3dc8HABACV0YDmIBv4kYRAWK0T8v7DAblnXJ0Qj4b/i8F3o169cOMeeta0BRMuux/qr7b6/Vh9GUPTz9RmE5xxfaiXKQBNqwTDASBhSwPkHXu6/MR0kXbuu74CRXNShmrz7oAEZvsNYyBm1aFk+L975XiqvnpBvZcxNP2sbbC576xeJADDQRVS3jsAt9UGpX1nT7g2qHqZaqeM8LIjvbrQhjoxEVJkOA7cm4pFk/6CsWHqXjs2+QZD058kCbU5ekBxvAQflUtC1CEJyW/thLsbS/OpY2PREh88d32p22VEbuudx1BIWh1UA9JxuDAJD0z8BFdH7MUwnQZaiYEZihiafiaH8N+w5JYQeVRC4ndt0Na3QpTvO+9UonN+jkaD9kszIYLk70LdLiNya+8FZuVTOfj07j8iVaM/Pc8yeP7xIOWC5NeYgsbpJ2xEHlEheZ0dYtseQPb0qK+sio6GKyo4FhKWhEB4dZP/A1OS0D4+B60PNmLTyD/DqIry7/Go1zA0/UhjNgXn9czTD7GMPKKCKxpoj5ERVquCthkIPy4jZvtxyAcO+W4Vn5QkiCA5E9U1uiF27ffrMTQZaTjxmh7Lhr+AZE0U/DWFiAKDoelHbqsNmpMDAroEnCQDkkeC5AYMB071IsPrPYjeVgPP0ZpT9zUboyHXHod8+pncF342pILjazRoSw78NCNJFtDXu6Ddc6Rblxi6QhUZCSk5CbH/bMAn/T8GwN5lX8TQ9CONKQmeXp7ULsmAql2CpllCzAEZEbZ26HcfhfDI8NTVedt1xIanoQHw862CQhO4R+5KsoD+RDt0lbVw19jg6cLjgpVQhYVBZU7C/sn9MLPwIwzQbcL4CJdPj0HBhaHpR57kBLiieyE0BaBpkRB5FIg56ELY5gMQ7e2QW1oAfB+QgSDcboQda0LzJcZePW7HgsG6/Ta4a2xw+zgsgVOn4Xv+kIB3rvwbcnRqRSsPUehiaIYScWrJNckDGCtlRFhP9WgkIaDbXgm5qQnC7fbp6XWPqdRwG3v3mp6mVUZ4lR3ygcNw+/jZ45JeD4wYhIO3ReOZwiUojDoObQgtT0g9x9D0I1VVDXR2I9qNCseez+ic6hpViLAJJGxrhiQAqfwA5DYnIOROi8oGVVCeQVJJcEX3zq+ZzuFG2F4b5BP18Jy+PutLmgH9sWe6GRtv/xNiVeGne5ZBMsJFvYah6Uee+gaE2wRc0YCQcOFl4U6fZkfUSDBtckDV6gKO1XqXJxNAl29ZDBbC7UaY7SRa0v07KCLJAmF7bXBXH/HxB0tw3jAabdMbMP2SrzAx+gSASN8eg0IKQ9OfhIDprZ0wp5hwfGwiZC3QkiLBZZBPTcERp0a2w2sl6BsE4nc0Q1NVC7fVBoHg7T16SRIk3VmWLpNFp3u51SeaIKVGQqj8M4IuCQF9owvuozW++TyNBpJOh5PXDYd72nH8K/t5pGpCfyTcKdyQ5FD7Zzf4MDT9TG5qAiqaEFtxam5gUmwsRD8TGkfGQPIAsRuPdpruE/jnG56dKjoakvrUQIcUFYW6vHS0JklQ/eTHI+9NjRGIX3cqTA2H2qHeuh/RZSq0ZcbDFa322fQjSRbQNnsQVnkCnupjED0c7OlYKV2+thGzh36Oq8M/R6Y2Cn1l6tDMY9dAs7miD9zUG1gMzV7WMcXHsPPUz8EYkhqzCS2Xp6M+6/sBjvaxTUgwnBqN16o9yIoqh1o6R6/FDCDr1B8bnBGospsR81IU9Bv3AmMGo93Y/V87SQhomj0Iq2mGdLINniM1PV5wQ2M24fCvLsF9d69EcezK07c6An0lLDvUtUVBPll34YZ0XgzNi5w6MRGIM8J2TSJOpkgQKoHYMbXoF1WJTG3PR55j9ScRm3QSlY/Eo/XFLERsOQxVVj84Y7RdPl1XuQXUThlaRzs0Njs8R2p6vliwSg3ViMGoujEWkyeuRHHs8tNhyZFwOj+G5kWgY8X0MyeZOwZGwXYFoEtrwYjkY4hTHYdW5b+rqJmGE2j9Hwe2fj0El/xhJ7SpZjQPjj3v4Jj69NQhHG+E5/hxQAif9Mzlqy7FkQc9+PSK15CqCT+92hDDkrqGodlHqRPi0XZpf1RN0MIT68aYwZXQnRGKSZKMIec6vfaTcLULY68pR6l9BFKfK0HU8QTvddKzkRvt8LS1+ez4alMSKl82YfkVL+OSPnStsquyom3YHp8Q0McR9wUMzVAmSZA03/eQVOFhaLkmCy1JarQVOHB58j5k9HIwXohaEkj82TGol/aHZ39lrx1X0y8FbW9qsDv7/3CxhWWH3yVtR/7I/4L6K4ZmTzA0Q5DGbMLx6wegNVGCuLrx++0qGcMS9/r1NNsX0qPr8e20bAz+ba33Vk9/cY0fjSM/0+Lxny/FPYbjfj0WXRwYmiFAHRsLKSIcteMz0BYvQXfNcQxLOM/odZBTSwI5o/eh9tps6D/Z7JdjqKKjceihEXh50l8xLjy4/xHpLQ1yK1TtnHDUUwzNICZpNBCXD0XlbCAjvh6D9HugVwfjJCXlIjXtOHybQNZXEd45qr6iHpiJvU/HYPe1f+EjJc7wm6qboNq4M+TuKgs2DM0gpE6Ih3twKg4UhmP46EqM0bWGbK/yfHIGH8Lxnw3zaW/TlZeDKa8uxa2RjVAzMDvZ/ulQpLnXB7qMkMfQDAKqiAi4c4agpZ8eNdfKCItvRU6/wzBLcp8Myw7RWicOpWh89sQcV14OZrz2Dv4j8iQALtP2Q/G7eZnCFxiagXJ65FsaMgAHfhmLK67dDVUApgEFWkuKhHiVGujJLZAqNVzXXYrfvPav04FJ5D8MzV6mCgtD67gRqBuphTTGjsToZlwZfTTQZQVMeM4JqHRayG3dC01VWBgq/jQKS258GVfoOUGd/I+h2UtUkZE4ed0wVP1cRs4g39yieLFThYVhzwsjUX7TXxChOstqS0R+wND0M3VsLI7cOxRNI5zIGXgQAxiWPqGKiMCe54dhz02vQC8xMC/ko5YIRJefCP7lBkMAQ9OfJAn75mTBcvXOPj2g0xMpBgeco7Og+ma7ovfte3oU9t70Mh810UVfNw2BZ++BQJfRJ3CI0Y/UCQmIGtLAwDyPxLBmnEwJU/Se9vzRePnn/+AcTAXW12Z2ejwKdV+PQvO5556DJEmYMWOGd1tbWxuKi4sRHx+PqKgoFBYWwmazdXpfVVUVCgoKEBERgaSkJMyePRtuPz2LOpBac/pjRNKxQJfRp7Tnj8bDr7yFGyJ4mUMJ53umQJfQZ3Q7NDdv3oy//vWvGDlyZKftM2fOxMcff4ylS5di7dq1OHbsGG677Tbvfo/Hg4KCArS3t2P9+vV48803sWjRIsydO7f73yJINQ7UspfpQ+r4ONzx/AoURPhu5aOLBn8NfaZbodnc3IyJEyfi9ddfR2xsrHe73W7HG2+8gT//+c+47rrrkJOTg4ULF2L9+vXYsGEDAODzzz/Hrl278NZbb+HSSy/FhAkT8Lvf/Q6vvPIK2tt7uLBsEJE0GjhyWwNdRp9ycuwluDGqItBl0EWuW6FZXFyMgoIC5OXlddpeWloKl8vVaXtWVhbS09NRUlICACgpKcGIESNgMn1/upCfnw+Hw4Hy8vKzHs/pdMLhcHR6Bb3LhmLMgMOBrqJPOXKtBul94AFnFNoUj54vWbIEW7duxebNP75f2Gq1QqfTISYmptN2k8kEq9XqbXNmYHbs79h3NvPmzcPTTz+ttNSAaksKg07V967TBooqIgKP3PRhoMsgUtbTrK6uxoMPPoi3334bYWHKRjx7Ys6cObDb7d5XdXV1rx27u6pu4MSErrC3h0HfeOF/XJpvGIGbI/f2QkVE56fov+zS0lLU1tbi8ssvh0ajgUajwdq1a/HSSy9Bo9HAZDKhvb0djY2Nnd5ns9lgNpsBAGaz+Uej6R0/d7T5Ib1eD4PB0OkV9CRwEKgLtlX0h+6rHRdsV/MTCck8NacgoCg0x40bh7KyMmzfvt37Gj16NCZOnOj9s1arxerVq73vqaioQFVVFSwWCwDAYrGgrKwMtbW13jarVq2CwWBAdna2j74WhQJ7exgy3gfEBZ4sqR58Cf58yz97qaq+xyNkBPli/iFF0TXN6OhoDB8+vNO2yMhIxMfHe7dPnjwZs2bNQlxcHAwGA6ZPnw6LxYKxY8cCAMaPH4/s7GxMmjQJ8+fPh9VqxeOPP47i4mLo9b5aJIxCwZGmGCSU7L3grX0NOYlcvagHljQnImH5hf+eqWt8fhvl888/D5VKhcLCQjidTuTn5+PVV1/17ler1Vi+fDmmTp0Ki8WCyMhIFBUV4ZlnnvF1KQGlblHBIySeop9Dk0uPsNdj4bHvv2Bb60/5iIaeaPKEQW5qDnQZfYYkROjdW+VwOGA0GnEtboEmSO89lq+5DMnPHWBonsOasixkzdh1wQerqUZm4dFl7+LacAZndy1o7IcPLkuFcPIuqnNxCxfW4EPY7fYLjplwiNdPtDsPo/RYWqDLCEoeIcFQru3Skyj3/NrAwKSgwtD0E8+Jerj2hcAofwDsbUhC6r+rLthOHRuLgpzveqEioq5jaPrRJUvsONZiDHQZQcUjJLSuSoK7+sgF29benoXnU/ggMAouDE0/kr/bjcpNPEU/03ZbP6S+37WbE5qvb+bybxR0GJr+JAQGvOvAkZaYQFcSFLbUpKHf4wLuwxcOTXViIm4ZVNYLVREpw9D0M/HdHlRtSA10GQG3+Vg6Up+QIe/c07U3JMRgRvw3/i2KqBsYmv4me5CwXUarJzinRvWGLTVpSH/C3fXABNDWzwCtJPmxKqLuYWj2AsPKXdhadXFe22z1aBG11ABPubJ1MCtvVyNBHemnqoi6j6HZC+SmJoRtiYRHXFw9J4+QUPr1EBjf3aLoferERMy5ZrmfqiLqGYZmL0ldeQKN7RGBLqNXlR5Lw6A3bBAKn/8kRUVgbPhBP1VF1DMMzd5SXYOdh1MCXUWv8QgJEcsN8OxTHn6Vv+yHYVo+y9xXqpzxgMzbeX2FodlLPA4HIneGXTSn6FuOpiNx+YUX4/ghTb8UDB5/AGqJv5q+8sG/r7rg8nvUdfzN7EVpn5xAu+zzhaWCjkdIiPo4Gp66OmVvVKlx4vUIfDDoM/8UdhHa0d6GtC+4wpEvMTR7keRoQXVTTKDL8LvSY2lIWK78qZG1U3Px3vBFvi/oIvaPE1dBVXYg0GX0KQzNXuSuPgLHF+Y+fYp+rMWIhIWR8JyoV/Q+TWYGpk17H6l8pIVPffLFmC6tJkVd1/fPFYNM+ntHsPe6JAyNs124cZBzejRobA8HAFQcNUG3PxzmDS6Erdyk6HM0A/ojafEJTDae/Wmk1H0qV6Ar6HsYmr3MfagKtQdzQzo0ba3ROHQiDlHLo5H4RRUgBIY0HYCnG8+jVw8aAPP/1eKNdN4y6WuVrmb0/4jXM32NoRkAA/7tQtMoPaK1obWStktWo2RDFga+exIZ5ZWQm5rQkye7qwcNQL+3bHg97Vuf1UjfS9dEYN/dERi0WQJC7wENQYvXNANAvfY77DjSL9BldJlHSNh0NB17/zoUg58sBzbsgNzU1LMPVamxe3Y8A9OP1JIKf57wNtRGLobtS+xpBoLsQeQ3kfD0D94Hr3mEhG3WVLTuNyL9s3ZklB6Ep6EcvnrwRMOkK7B5wv8C4P3l/hQmuQDOefUphmaAJL+3H19fNhjXDlc+NcdfXLIa7bIae44nQftpDNI/Ogi3dRcA+PTxr+phQzB+5jdckKMXLK7LhWjnxHZfYmgGiMdWiwGL03BoThzSohoC0uP0CAmN7REo25sGnVWDCJuE5NV1SGuoh9u6u0fXK89F0uoQseAEfp/EBYb9bdrRXBz/VRLkFuV3ZtG5MTQDSPPVVqir+uPrR4bg6hEVfg9OW2s09m3KAAB4zE5Ebw1Dv0+tyDr2/aN0fdmj/CFJq8OBP+RgW+bzAML8eKSL2472Nty69tfIetYBTwUD09cYmoEkBDz7K5E99yS+fsa3wWlvD0NlQzwAwOnSQP+lAaZNDlyyfTMAQNLrIbe0+DUkzyTp9dj/+8ux/a7nEaViYPqDXW7FnJqf4eDUgRi8fQc8CleXoq5haAYBt9WGoU8IfP27ngfnxiMZMP47CuF1Lpi/Kfdul9vacOanKl2urafarhuJDXf+L6JUvI7pD6tb1Xhg6SwM/N0OiJadgS6nT2NoBgmPrRZDfyvw9R+UB6dHSGiXNShbnoXMJUfhrjz1H42vRrp7ShUWBudv6jnw4wdO4cLkw9ej9qEMDNiwATLnY/odQzOIeOrqMHSOBxUFw1A3+lTkxWY2YFDc8XO+Z9O+TEiNWmQsdyFt7Ra4g3AJsMMPX45tI18EcPE+J8nXPELGpEPjUPnKEMS8vx1S23eBLumiwdAMMp4T9Yj5Zwli/nnqZ01qPziMiedsP+TQHu8gTjD2MVzjR+PZon9CLzEwfcUlPBi6djIG/fcBGJo2BM0ZxcWCoRnk3EeOAkcCXUX3iJ+MQvHL7+LWSN7/7CtH3M24Zt10DJ66v+d3ZVG3MDTJL9QGAw7N8qAwSvkiHvRjHiHjmrLboX45AYO/2AG5rS3QJV20GJrkF7tfGIz9lr+Byxv0nEfIGL3ll0i+rxaeEwd5Oh5g/I0mn2u5PRfLfvYKn/PjI5dvnng6MJUt7Ez+wd9q8inVqKH4f/Nfw6V6faBLCXnl7a0Y8Plk9LvXysAMIjw9J59p/kUu7nxqJa4M47/FPeERMh44cjV2vjgCgxZv6LW7tqhrGJrUY2qDAZUzh+PvRS8zMHvo2zYZd3/2ALKfqYKhZkOgy6GzUPQb/tRTT0GSpE6vrKws7/62tjYUFxcjPj4eUVFRKCwshM3W+bEOVVVVKCgoQEREBJKSkjB79my4eY9syNJkZmD/3/pjx5S/MDB7YF0bkPnBFPzh5rsw+Neb4a7h85KCleKe5rBhw/DFF198/wGa7z9i5syZ+OSTT7B06VIYjUZMmzYNt912G7799tTq3B6PBwUFBTCbzVi/fj1qampwzz33QKvV4tlnn/XB16HeooqIgOOmkZj9h7dQEGGHVlIHuqSQ1OA5iZyPZiLr1UYM3l0Kj8yT8WCnODQ1Gg3MZvOPttvtdrzxxhtYvHgxrrvuOgDAwoULMXToUGzYsAFjx47F559/jl27duGLL76AyWTCpZdeit/97nd49NFH8dRTT0Gn0/X8G5HfqYcNwe6Ho1B+/UuIUOkAMDC74/+dGIQPnh2HQf/azLAMIYrPp/bt24eUlBQMGDAAEydORFVVFQCgtLQULpcLeXl53rZZWVlIT09HSUkJAKCkpAQjRoyAyWTytsnPz4fD4UB5eTnOxel0wuFwdHpR75P0ejROsuDOf69GZf4bpwOTlHAJDz5qicDAdx7A2sKRMLyzAWBghhRFPc3c3FwsWrQIQ4YMQU1NDZ5++mlcffXV2LlzJ6xWK3Q6HWJiYjq9x2QywWo9dX3GarV2CsyO/R37zmXevHl4+umnlZRKvqRSo2HSFRg2dSfeS+V6mN3hETLuODgeR18diNjSOlyyl6PioUpRaE6YMMH755EjRyI3NxcZGRl49913ER4e7vPiOsyZMwezZs3y/uxwOJCWlua349H3JI0Gh+aOQcm9f0KsOgJccV2Z454WrG9LxKyP7sHgp3fB4GBYhroeTTmKiYnB4MGDsX//flx//fVob29HY2Njp96mzWbzXgM1m83YtGlTp8/oGF0/23XSDnq9HnpOlu51alMSDvzmEmwq+jOMqohAlxNS1rSqcO+q/4J5nQpxa6twyVGGZV/Rozkizc3NOHDgAJKTk5GTkwOtVovVq1d791dUVKCqqgoWiwUAYLFYUFZWhtraWm+bVatWwWAwIDs7uyelkI+pExPRf7kD24pehFHlv7OIvua4pwUD3vtvzL+pEIOnboZh8Qa4jx4LdFnkQ4p6mg8//DBuvvlmZGRk4NixY3jyySehVqtx1113wWg0YvLkyZg1axbi4uJgMBgwffp0WCwWjB07FgAwfvx4ZGdnY9KkSZg/fz6sVisef/xxFBcXsycZZI7+chDeS36Bgz1dtPKkHi8fuQ71r2Vg0Lsb4eEK6n2WotA8cuQI7rrrLpw4cQKJiYm46qqrsGHDBiQmnlok9/nnn4dKpUJhYSGcTify8/Px6quvet+vVquxfPlyTJ06FRaLBZGRkSgqKsIzzzzj229FPaIKC0PcTUcZmOfgEh48e3wEShvTceSdTETWyoiuaIRn115Ei5pAl0d+JgkRev8kOhwOGI1GXItboOGK4H5x4H/HYv8vFwS6jKDhEh680DAYf91xNdLe1CB862F46uoCXRb5iFu4sAYfwm63w2AwnLct7z2nsxr4ThN23N6GkbqLe7TcKVx4pWEI3nj7BvT/5yFccnQ7AP8+H56CG28WprMS2/bg7pdm4Yj74nxUhVO48Mf6SzD6xQfxxbiBSJ23ngM6BIA9TToX2YPkFzaiQDyCT2bOR6omKtAV+V2lqxlfnhyII+1xeO+ta5G2sAIpx9ezV0mdMDTp3GQPzC+UnArOWX07OG8/kIfjz2UifHUZACCljWFJZ8fTczo/IWB+YT3u/u+ZsHxXiOOelkBX1GMeIXtfVe5mjNp0F1rv1EH/yWbIbW18aBmdF3ua1CX6FZuh/0yNn/52NtZN+SMS1JGBLum8XMKDBrkNk/begYa27yfn1x2OxYB/f9+HVLe6YS7ZAXfoTSKhAGFoUtfJHqTP24Srpdn4+v7gDE6X8OCdJhP+sPQXyHzfAWnnPsS62r37YwNYG/UNDE1SRLjdyHh2E34qgqvHecTdjC9ODsBz7xbikter0b+6BOw7kj8wNEkx4XYj7Q8bcaX+YVTc91pAamjwnMSHLf3xzOc/R1itGgk73Yj6ej8yTpSAD08hf2JoUvfIHgz8azXuv/5KvJ72ba8e+pOTYXj4rV+j/x+/w6CTm4DT1yM52k29gaFJ3eauPoJjd2bgipd/gVEJx/C//b5AlNT9hVfU0veTOY57WnBL+STI/0yCI0OFy27ehcb2cFj/rz+S1h9H+u71kH3xJYgU4r3n5BOSVgf3VcMha7s3i01IwKE7BVKSG9DUpkfcX6Og/2wrHwVBvYL3nlOvE652qL/a2qNHrA3+7NT/9t0p9NQXcHI7EZECDE0iIgUYmkRECjA0iYgUYGgSESnA0CQiUoChSUSkAEOTiEgBhiYRkQIMTSIiBRiaREQKMDSJiBRgaBIRKcDQJCJSgKFJRKQAQ5OISAGGJhGRAgxNIiIFGJpERAowNImIFGBoEhEpwNAkIlJAcWgePXoUd999N+Lj4xEeHo4RI0Zgy5Yt3v1CCMydOxfJyckIDw9HXl4e9u3b1+kz6uvrMXHiRBgMBsTExGDy5Mlobm7u+bchIvIzRaHZ0NCAK6+8ElqtFitWrMCuXbvwpz/9CbGxsd428+fPx0svvYQFCxZg48aNiIyMRH5+Ptra2rxtJk6ciPLycqxatQrLly/HunXrMGXKFN99KyIiP5GEEKKrjR977DF8++23+Prrr8+6XwiBlJQUPPTQQ3j44YcBAHa7HSaTCYsWLcKdd96J3bt3Izs7G5s3b8bo0aMBACtXrsSNN96II0eOICUl5YJ1OBwOGI1GXItboJG0XS2fiOis3MKFNfgQdrsdBoPhvG0V9TQ/+ugjjB49Gr/4xS+QlJSEyy67DK+//rp3f2VlJaxWK/Ly8rzbjEYjcnNzUVJSAgAoKSlBTEyMNzABIC8vDyqVChs3bjzrcZ1OJxwOR6cXEVEgKArNgwcP4rXXXsOgQYPw2WefYerUqfjNb36DN998EwBgtVoBACaTqdP7TCaTd5/VakVSUlKn/RqNBnFxcd42PzRv3jwYjUbvKy0tTUnZREQ+oyg0ZVnG5ZdfjmeffRaXXXYZpkyZgvvvvx8LFizwV30AgDlz5sBut3tf1dXVfj0eEdG5KArN5ORkZGdnd9o2dOhQVFVVAQDMZjMAwGazdWpjs9m8+8xmM2prazvtd7vdqK+v97b5Ib1eD4PB0OlFRBQIikLzyiuvREVFRadte/fuRUZGBgAgMzMTZrMZq1ev9u53OBzYuHEjLBYLAMBisaCxsRGlpaXeNl9++SVkWUZubm63vwgRUW/QKGk8c+ZM/OQnP8Gzzz6L//zP/8SmTZvwt7/9DX/7298AAJIkYcaMGfj973+PQYMGITMzE0888QRSUlJw6623AjjVM73hhhu8p/UulwvTpk3DnXfe2aWRcyKiQFIUmmPGjMGyZcswZ84cPPPMM8jMzMQLL7yAiRMnets88sgjaGlpwZQpU9DY2IirrroKK1euRFhYmLfN22+/jWnTpmHcuHFQqVQoLCzESy+95LtvRUTkJ4rmaQYLztMkIl/y2zxNIqKLHUOTiEgBhiYRkQIMTSIiBRiaREQKMDSJiBRgaBIRKcDQJCJSgKFJRKQAQ5OISAGGJhGRAgxNIiIFGJpERAowNImIFGBoEhEpwNAkIlKAoUlEpABDk4hIAYYmEZECDE0iIgUYmkRECjA0iYgUYGgSESnA0CQiUoChSUSkAEOTiEgBhiYRkQIMTSIiBRiaREQKMDSJiBRgaBIRKcDQJCJSgKFJRKQAQ5OISAGGJhGRAopCs3///pAk6Uev4uJiAEBbWxuKi4sRHx+PqKgoFBYWwmazdfqMqqoqFBQUICIiAklJSZg9ezbcbrfvvhERkR8pCs3NmzejpqbG+1q1ahUA4Be/+AUAYObMmfj444+xdOlSrF27FseOHcNtt93mfb/H40FBQQHa29uxfv16vPnmm1i0aBHmzp3rw69EROQ/khBCdPfNM2bMwPLly7Fv3z44HA4kJiZi8eLFuP322wEAe/bswdChQ1FSUoKxY8dixYoVuOmmm3Ds2DGYTCYAwIIFC/Doo4+irq4OOp2uS8d1OBwwGo24FrdAI2m7Wz4REQDALVxYgw9ht9thMBjO27bb1zTb29vx1ltv4b777oMkSSgtLYXL5UJeXp63TVZWFtLT01FSUgIAKCkpwYgRI7yBCQD5+flwOBwoLy8/57GcTiccDkenFxFRIHQ7ND/44AM0NjbiV7/6FQDAarVCp9MhJiamUzuTyQSr1eptc2Zgduzv2Hcu8+bNg9Fo9L7S0tK6WzYRUY90OzTfeOMNTJgwASkpKb6s56zmzJkDu93ufVVXV/v9mEREZ6PpzpsOHz6ML774Au+//753m9lsRnt7OxobGzv1Nm02G8xms7fNpk2bOn1Wx+h6R5uz0ev10Ov13SmViMinutXTXLhwIZKSklBQUODdlpOTA61Wi9WrV3u3VVRUoKqqChaLBQBgsVhQVlaG2tpab5tVq1bBYDAgOzu7u9+BiKjXKO5pyrKMhQsXoqioCBrN9283Go2YPHkyZs2ahbi4OBgMBkyfPh0WiwVjx44FAIwfPx7Z2dmYNGkS5s+fD6vViscffxzFxcXsSRJRSFAcml988QWqqqpw3333/Wjf888/D5VKhcLCQjidTuTn5+PVV1/17ler1Vi+fDmmTp0Ki8WCyMhIFBUV4ZlnnunZtyAi6iU9mqcZKJynSUS+1CvzNImILkYMTSIiBRiaREQKMDSJiBRgaBIRKcDQJCJSgKFJRKQAQ5OISAGGJhGRAgxNIiIFGJpERAowNImIFGBoEhEpwNAkIlKAoUlEpABDk4hIAYYmEZECDE0iIgUYmkRECjA0iYgUYGgSESnA0CQiUoChSUSkAEOTiEgBhiYRkQIMTSIiBRiaREQKMDSJiBRgaBIRKcDQJCJSgKFJRKQAQ5OISAGGJhGRAgxNIiIFGJpERAowNImIFGBoEhEpwNAkIlJAE+gCukMIAQBwwwWIABdDRCHPDReA77PlfEIyNE+cOAEA+AafBrgSIupLmpqaYDQaz9smJEMzLi4OAFBVVXXBLxhsHA4H0tLSUF1dDYPBEOhyuox19y7W3buEEGhqakJKSsoF24ZkaKpUpy7FGo3GkPo/5kwGgyEka2fdvYt1956udsA4EEREpABDk4hIgZAMTb1ejyeffBJ6vT7QpSgWqrWz7t7FuoOXJLoyxk5ERABCtKdJRBQoDE0iIgUYmkRECjA0iYgUYGgSESkQkqH5yiuvoH///ggLC0Nubi42bdoU0HrWrVuHm2++GSkpKZAkCR988EGn/UIIzJ07F8nJyQgPD0deXh727dvXqU19fT0mTpwIg8GAmJgYTJ48Gc3NzX6te968eRgzZgyio6ORlJSEW2+9FRUVFZ3atLW1obi4GPHx8YiKikJhYSFsNlunNlVVVSgoKEBERASSkpIwe/ZsuN1uv9X92muvYeTIkd67TiwWC1asWBHUNZ/Nc889B0mSMGPGjKCu/amnnoIkSZ1eWVlZQV2zX4kQs2TJEqHT6cQ//vEPUV5eLu6//34RExMjbDZbwGr69NNPxW9/+1vx/vvvCwBi2bJlnfY/99xzwmg0ig8++EB899134j/+4z9EZmamaG1t9ba54YYbxKhRo8SGDRvE119/LQYOHCjuuusuv9adn58vFi5cKHbu3Cm2b98ubrzxRpGeni6am5u9bR544AGRlpYmVq9eLbZs2SLGjh0rfvKTn3j3u91uMXz4cJGXlye2bdsmPv30U5GQkCDmzJnjt7o/+ugj8cknn4i9e/eKiooK8T//8z9Cq9WKnTt3Bm3NP7Rp0ybRv39/MXLkSPHggw96twdj7U8++aQYNmyYqKmp8b7q6uqCumZ/CrnQvOKKK0RxcbH3Z4/HI1JSUsS8efMCWNX3fhiasiwLs9ks/vjHP3q3NTY2Cr1eL9555x0hhBC7du0SAMTmzZu9bVasWCEkSRJHjx7ttdpra2sFALF27VpvnVqtVixdutTbZvfu3QKAKCkpEUKc+gdDpVIJq9XqbfPaa68Jg8EgnE5nr9UeGxsr/v73v4dEzU1NTWLQoEFi1apV4pprrvGGZrDW/uSTT4pRo0addV+w1uxPIXV63t7ejtLSUuTl5Xm3qVQq5OXloaSkJICVnVtlZSWsVmunmo1GI3Jzc701l5SUICYmBqNHj/a2ycvLg0qlwsaNG3utVrvdDuD7VaRKS0vhcrk61Z6VlYX09PROtY8YMQImk8nbJj8/Hw6HA+Xl5X6v2ePxYMmSJWhpaYHFYgmJmouLi1FQUNCpRiC4/7737duHlJQUDBgwABMnTkRVVVXQ1+wvIbXK0fHjx+HxeDr95QOAyWTCnj17AlTV+VmtVgA4a80d+6xWK5KSkjrt12g0iIuL87bxN1mWMWPGDFx55ZUYPny4ty6dToeYmJjz1n6279axz1/KyspgsVjQ1taGqKgoLFu2DNnZ2di+fXvQ1gwAS5YswdatW7F58+Yf7QvWv+/c3FwsWrQIQ4YMQU1NDZ5++mlcffXV2LlzZ9DW7E8hFZrkP8XFxdi5cye++eabQJfSJUOGDMH27dtht9vx3nvvoaioCGvXrg10WedVXV2NBx98EKtWrUJYWFigy+myCRMmeP88cuRI5ObmIiMjA++++y7Cw8MDWFlghNTpeUJCAtRq9Y9G5mw2G8xmc4CqOr+Ous5Xs9lsRm1tbaf9brcb9fX1vfK9pk2bhuXLl+Orr75Camqqd7vZbEZ7ezsaGxvPW/vZvlvHPn/R6XQYOHAgcnJyMG/ePIwaNQovvvhiUNdcWlqK2tpaXH755dBoNNBoNFi7di1eeuklaDQamEymoK39TDExMRg8eDD2798f1H/f/hJSoanT6ZCTk4PVq1d7t8myjNWrV8NisQSwsnPLzMyE2WzuVLPD4cDGjRu9NVssFjQ2NqK0tNTb5ssvv4Qsy8jNzfVbbUIITJs2DcuWLcOXX36JzMzMTvtzcnKg1Wo71V5RUYGqqqpOtZeVlXUK/VWrVsFgMCA7O9tvtf+QLMtwOp1BXfO4ceNQVlaG7du3e1+jR4/GxIkTvX8O1trP1NzcjAMHDiA5OTmo/779JtAjUUotWbJE6PV6sWjRIrFr1y4xZcoUERMT02lkrrc1NTWJbdu2iW3btgkA4s9//rPYtm2bOHz4sBDi1JSjmJgY8eGHH4odO3aIW2655axTji677DKxceNG8c0334hBgwb5fcrR1KlThdFoFGvWrOk0neTkyZPeNg888IBIT08XX375pdiyZYuwWCzCYrF493dMJxk/frzYvn27WLlypUhMTPTrdJLHHntMrF27VlRWVoodO3aIxx57TEiSJD7//POgrflczhw9D9baH3roIbFmzRpRWVkpvv32W5GXlycSEhJEbW1t0NbsTyEXmkII8Ze//EWkp6cLnU4nrrjiCrFhw4aA1vPVV18JnHouZqdXUVGREOLUtKMnnnhCmEwmodfrxbhx40RFRUWnzzhx4oS46667RFRUlDAYDOLee+8VTU1Nfq37bDUDEAsXLvS2aW1tFb/+9a9FbGysiIiIED//+c9FTU1Np885dOiQmDBhgggPDxcJCQnioYceEi6Xy29133fffSIjI0PodDqRmJgoxo0b5w3MYK35XH4YmsFY+x133CGSk5OFTqcT/fr1E3fccYfYv39/UNfsT1xPk4hIgZC6pklEFGgMTSIiBRiaREQKMDSJiBRgaBIRKcDQJCJSgKFJRKQAQ5OISAGGJhGRAgxNIiIFGJpERAr8f6kZH3qt2aOTAAAAAElFTkSuQmCC",
      "text/plain": [
       "<Figure size 640x480 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "plt.imshow(selected_mask)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "acce962b-e6dd-421e-b3c3-5a3908c59b79",
   "metadata": {},
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "id": "993d18dc",
   "metadata": {},
   "outputs": [],
   "source": [
    "seed = 1645\n",
    "np.random.seed(seed)\n",
    "torch.manual_seed(seed)\n",
    "\n",
    "# 设置输出目录\n",
    "# 模型选择范围\n",
    "# ['deeplabv3_mobilenet_v3_large',\n",
    "#  'deeplabv3_resnet101',\n",
    "#  'deeplabv3_resnet50',\n",
    "#  'fcn_resnet101',\n",
    "#  'fcn_resnet50',\n",
    "#  'lraspp_mobilenet_v3_large']\n",
    "model_name = 'deeplabv3_resnet50'\n",
    "pretrained = True\n",
    "output = os.path.join(\"echoNetOutput\", \"segmentation\", \"{}_{}\".format(model_name, \"pretrained\" if pretrained else \"random\"))\n",
    "os.makedirs(output, exist_ok=True)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "id": "dbb1118e",
   "metadata": {},
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "/home/yawei/anaconda3/lib/python3.10/site-packages/torchvision/models/_utils.py:208: UserWarning: The parameter 'pretrained' is deprecated since 0.13 and may be removed in the future, please use 'weights' instead.\n",
      "  warnings.warn(\n",
      "/home/yawei/anaconda3/lib/python3.10/site-packages/torchvision/models/_utils.py:223: UserWarning: Arguments other than a weight enum or `None` for 'weights' are deprecated since 0.13 and may be removed in the future. The current behavior is equivalent to passing `weights=DeepLabV3_ResNet50_Weights.COCO_WITH_VOC_LABELS_V1`. You can also use `weights=DeepLabV3_ResNet50_Weights.DEFAULT` to get the most up-to-date weights.\n",
      "  warnings.warn(msg)\n"
     ]
    }
   ],
   "source": [
    "device = torch.device(\"cuda\" if torch.cuda.is_available() else \"cpu\")\n",
    "\n",
    "# Set up model\n",
    "model = torchvision.models.segmentation.__dict__[model_name](pretrained=pretrained, aux_loss=True)\n",
    "\n",
    "model.classifier[-1] = torch.nn.Conv2d(model.classifier[-1].in_channels, 1, kernel_size=model.classifier[-1].kernel_size)  # change number of outputs to 1\n",
    "if device.type == \"cuda\":\n",
    "    model = torch.nn.DataParallel(model)\n",
    "model.to(device)\n",
    "\n",
    "# 加载上次训练的模型\n",
    "weights = None\n",
    "if weights is not None:\n",
    "    checkpoint = torch.load(weights)\n",
    "    model.load_state_dict(checkpoint['state_dict'])\n",
    "\n",
    "lr = 1e-5\n",
    "lr_step_period = None\n",
    "weight_decay = 0\n",
    "# Set up optimizer\n",
    "optim = torch.optim.SGD(model.parameters(), lr=lr, momentum=0.9, weight_decay=weight_decay)\n",
    "if lr_step_period is None:\n",
    "    lr_step_period = math.inf\n",
    "scheduler = torch.optim.lr_scheduler.StepLR(optim, lr_step_period)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "id": "ed969988",
   "metadata": {},
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "100%|██████████████████████████████████████████████████████████████████████████| 16/16 [00:13<00:00,  1.20it/s]\n"
     ]
    }
   ],
   "source": [
    "data_dir = '/mnt/datawow/lyl/images/images/cardiac/echoNetDynamic/EchoNet-Dynamic/'\n",
    "# Compute mean and std\n",
    "mean, std = get_mean_and_std(EchoDataset(root=data_dir, split=\"train\"))\n",
    "tasks = [\"LargeFrame\", \"SmallFrame\", \"LargeTrace\", \"SmallTrace\"]\n",
    "kwargs = {\"target_type\": tasks,\n",
    "          \"mean\": mean,\n",
    "          \"std\": std\n",
    "          }"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 11,
   "id": "a0090f5b",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "{'target_type': ['LargeFrame', 'SmallFrame', 'LargeTrace', 'SmallTrace'],\n",
       " 'mean': array([31.676437, 32.208218, 33.067966], dtype=float32),\n",
       " 'std': array([49.19874 , 49.468895, 50.28772 ], dtype=float32)}"
      ]
     },
     "execution_count": 11,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "kwargs"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 42,
   "id": "af8bcb1c",
   "metadata": {},
   "outputs": [],
   "source": [
    "dataset = {}\n",
    "num_train_patients = None\n",
    "dataset[\"train\"] = EchoDataset(root=data_dir, split=\"train\", **kwargs)\n",
    "if num_train_patients is not None and len(dataset[\"train\"]) > num_train_patients:\n",
    "    # Subsample patients (used for ablation experiment)\n",
    "    indices = np.random.choice(len(dataset[\"train\"]), num_train_patients, replace=False)\n",
    "    dataset[\"train\"] = torch.utils.data.Subset(dataset[\"train\"], indices)\n",
    "dataset[\"val\"] = EchoDataset(root=data_dir, split=\"val\", **kwargs)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 44,
   "id": "898ced8b",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "(3, 112, 112)\n",
      "(3, 112, 112)\n",
      "(112, 112)\n",
      "(112, 112)\n"
     ]
    }
   ],
   "source": [
    "for x,y in dataset[\"train\"]:\n",
    "    for yi in y:\n",
    "        print(yi.shape)\n",
    "    break"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 35,
   "id": "ca35994f",
   "metadata": {},
   "outputs": [],
   "source": [
    "def _video_collate_fn(x):\n",
    "    \"\"\"Collate function for Pytorch dataloader to merge multiple videos.\n",
    "\n",
    "    This function should be used in a dataloader for a dataset that returns\n",
    "    a video as the first element, along with some (non-zero) tuple of\n",
    "    targets. Then, the input x is a list of tuples:\n",
    "      - x[i][0] is the i-th video in the batch\n",
    "      - x[i][1] are the targets for the i-th video\n",
    "\n",
    "    This function returns a 3-tuple:\n",
    "      - The first element is the videos concatenated along the frames\n",
    "        dimension. This is done so that videos of different lengths can be\n",
    "        processed together (tensors cannot be \"jagged\", so we cannot have\n",
    "        a dimension for video, and another for frames).\n",
    "      - The second element is contains the targets with no modification.\n",
    "      - The third element is a list of the lengths of the videos in frames.\n",
    "    \"\"\"\n",
    "    video, target = zip(*x)  # Extract the videos and targets\n",
    "\n",
    "    # ``video'' is a tuple of length ``batch_size''\n",
    "    #   Each element has shape (channels=3, frames, height, width)\n",
    "    #   height and width are expected to be the same across videos, but\n",
    "    #   frames can be different.\n",
    "\n",
    "    # ``target'' is also a tuple of length ``batch_size''\n",
    "    # Each element is a tuple of the targets for the item.\n",
    "\n",
    "    i = list(map(lambda t: t.shape[1], video))  # Extract lengths of videos in frames\n",
    "\n",
    "    # This contatenates the videos along the the frames dimension (basically\n",
    "    # playing the videos one after another). The frames dimension is then\n",
    "    # moved to be first.\n",
    "    # Resulting shape is (total frames, channels=3, height, width)\n",
    "    video = torch.as_tensor(np.swapaxes(np.concatenate(video, 1), 0, 1))\n",
    "\n",
    "    # Swap dimensions (approximately a transpose)\n",
    "    # Before: target[i][j] is the j-th target of element i\n",
    "    # After:  target[i][j] is the i-th target of element j\n",
    "    target = zip(*target)\n",
    "\n",
    "    return video, target, i\n",
    "\n",
    "\n",
    "def run_epoch(model, dataloader, train, optim, device):\n",
    "    \"\"\"Run one epoch of training/evaluation for segmentation.\n",
    "\n",
    "    Args:\n",
    "        model (torch.nn.Module): Model to train/evaulate.\n",
    "        dataloder (torch.utils.data.DataLoader): Dataloader for dataset.\n",
    "        train (bool): Whether or not to train model.\n",
    "        optim (torch.optim.Optimizer): Optimizer\n",
    "        device (torch.device): Device to run on\n",
    "    \"\"\"\n",
    "\n",
    "    total = 0.\n",
    "    n = 0\n",
    "\n",
    "    pos = 0\n",
    "    neg = 0\n",
    "    pos_pix = 0\n",
    "    neg_pix = 0\n",
    "\n",
    "    model.train(train)\n",
    "\n",
    "    large_inter = 0\n",
    "    large_union = 0\n",
    "    small_inter = 0\n",
    "    small_union = 0\n",
    "    large_inter_list = []\n",
    "    large_union_list = []\n",
    "    small_inter_list = []\n",
    "    small_union_list = []\n",
    "    \n",
    "    # 数据集中已知large和small分别在哪一帧\n",
    "    with torch.set_grad_enabled(train):\n",
    "        with tqdm.tqdm(total=len(dataloader)) as pbar:\n",
    "            for (_, (large_frame, small_frame, large_trace, small_trace)) in dataloader:\n",
    "                # Count number of pixels in/out of human segmentation\n",
    "                pos += (large_trace == 1).sum().item()\n",
    "                pos += (small_trace == 1).sum().item()\n",
    "                neg += (large_trace == 0).sum().item()\n",
    "                neg += (small_trace == 0).sum().item()\n",
    "\n",
    "                # Count number of pixels in/out of computer segmentation\n",
    "                pos_pix += (large_trace == 1).sum(0).to(\"cpu\").detach().numpy()\n",
    "                pos_pix += (small_trace == 1).sum(0).to(\"cpu\").detach().numpy()\n",
    "                neg_pix += (large_trace == 0).sum(0).to(\"cpu\").detach().numpy()\n",
    "                neg_pix += (small_trace == 0).sum(0).to(\"cpu\").detach().numpy()\n",
    "\n",
    "                # Run prediction for diastolic frames and compute loss\n",
    "                large_frame = large_frame.to(device)\n",
    "                large_trace = large_trace.to(device)\n",
    "                y_large = model(large_frame)[\"out\"]\n",
    "                loss_large = torch.nn.functional.binary_cross_entropy_with_logits(y_large[:, 0, :, :], large_trace, reduction=\"sum\")\n",
    "                # Compute pixel intersection and union between human and computer segmentations\n",
    "                large_inter += np.logical_and(y_large[:, 0, :, :].detach().cpu().numpy() > 0., large_trace[:, :, :].detach().cpu().numpy() > 0.).sum()\n",
    "                large_union += np.logical_or(y_large[:, 0, :, :].detach().cpu().numpy() > 0., large_trace[:, :, :].detach().cpu().numpy() > 0.).sum()\n",
    "                large_inter_list.extend(np.logical_and(y_large[:, 0, :, :].detach().cpu().numpy() > 0., large_trace[:, :, :].detach().cpu().numpy() > 0.).sum((1, 2)))\n",
    "                large_union_list.extend(np.logical_or(y_large[:, 0, :, :].detach().cpu().numpy() > 0., large_trace[:, :, :].detach().cpu().numpy() > 0.).sum((1, 2)))\n",
    "\n",
    "                # Run prediction for systolic frames and compute loss\n",
    "                small_frame = small_frame.to(device)\n",
    "                small_trace = small_trace.to(device)\n",
    "                y_small = model(small_frame)[\"out\"]\n",
    "                loss_small = torch.nn.functional.binary_cross_entropy_with_logits(y_small[:, 0, :, :], small_trace, reduction=\"sum\")\n",
    "                # Compute pixel intersection and union between human and computer segmentations\n",
    "                small_inter += np.logical_and(y_small[:, 0, :, :].detach().cpu().numpy() > 0., small_trace[:, :, :].detach().cpu().numpy() > 0.).sum()\n",
    "                small_union += np.logical_or(y_small[:, 0, :, :].detach().cpu().numpy() > 0., small_trace[:, :, :].detach().cpu().numpy() > 0.).sum()\n",
    "                small_inter_list.extend(np.logical_and(y_small[:, 0, :, :].detach().cpu().numpy() > 0., small_trace[:, :, :].detach().cpu().numpy() > 0.).sum((1, 2)))\n",
    "                small_union_list.extend(np.logical_or(y_small[:, 0, :, :].detach().cpu().numpy() > 0., small_trace[:, :, :].detach().cpu().numpy() > 0.).sum((1, 2)))\n",
    "\n",
    "                # Take gradient step if training\n",
    "                loss = (loss_large + loss_small) / 2\n",
    "                if train:\n",
    "                    optim.zero_grad()\n",
    "                    loss.backward()\n",
    "                    optim.step()\n",
    "\n",
    "                # Accumulate losses and compute baselines\n",
    "                total += loss.item()\n",
    "                n += large_trace.size(0)\n",
    "                p = pos / (pos + neg)\n",
    "                p_pix = (pos_pix + 1) / (pos_pix + neg_pix + 2)\n",
    "\n",
    "                # Show info on process bar\n",
    "                pbar.set_postfix_str(\"{:.4f} ({:.4f}) / {:.4f} {:.4f}, {:.4f}, {:.4f}\".format(total / n / 112 / 112, loss.item() / large_trace.size(0) / 112 / 112, -p * math.log(p) - (1 - p) * math.log(1 - p), (-p_pix * np.log(p_pix) - (1 - p_pix) * np.log(1 - p_pix)).mean(), 2 * large_inter / (large_union + large_inter), 2 * small_inter / (small_union + small_inter)))\n",
    "                pbar.update()\n",
    "\n",
    "    large_inter_list = np.array(large_inter_list)\n",
    "    large_union_list = np.array(large_union_list)\n",
    "    small_inter_list = np.array(small_inter_list)\n",
    "    small_union_list = np.array(small_union_list)\n",
    "\n",
    "    return (total / n / 112 / 112,\n",
    "            large_inter_list,\n",
    "            large_union_list,\n",
    "            small_inter_list,\n",
    "            small_union_list,\n",
    "            )"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 50,
   "id": "c66aa9ec",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Epoch #0\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "100%|███████████████████████| 373/373 [10:45<00:00,  1.73s/it, 0.1121 (0.0541) / 0.3135 0.1346, 0.7482, 0.7902]\n",
      "100%|█████████████████████████| 65/65 [01:51<00:00,  1.72s/it, 0.0672 (0.0482) / 0.3145 0.1385, 0.8290, 0.8909]"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Epoch #1\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "\n",
      "100%|███████████████████████| 373/373 [06:16<00:00,  1.01s/it, 0.0546 (0.0568) / 0.3135 0.1346, 0.8621, 0.8952]\n",
      "100%|█████████████████████████| 65/65 [00:25<00:00,  2.56it/s, 0.0472 (0.0512) / 0.3145 0.1385, 0.8812, 0.9046]"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Epoch #2\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "\n",
      "100%|███████████████████████| 373/373 [07:35<00:00,  1.22s/it, 0.0465 (0.0438) / 0.3135 0.1346, 0.8793, 0.9107]\n",
      "100%|█████████████████████████| 65/65 [01:54<00:00,  1.76s/it, 0.0421 (0.0398) / 0.3145 0.1385, 0.8907, 0.9179]"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Epoch #3\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "\n",
      "100%|███████████████████████| 373/373 [02:29<00:00,  2.49it/s, 0.0434 (0.0397) / 0.3135 0.1346, 0.8860, 0.9165]\n",
      "100%|█████████████████████████| 65/65 [00:12<00:00,  5.19it/s, 0.0418 (0.0470) / 0.3145 0.1385, 0.8896, 0.9232]"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Epoch #4\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "\n",
      "100%|███████████████████████| 373/373 [01:49<00:00,  3.41it/s, 0.0416 (0.0439) / 0.3135 0.1346, 0.8906, 0.9195]\n",
      "100%|█████████████████████████| 65/65 [00:12<00:00,  5.27it/s, 0.0399 (0.0385) / 0.3145 0.1385, 0.8940, 0.9261]"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Epoch #5\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "\n",
      "100%|███████████████████████| 373/373 [01:10<00:00,  5.31it/s, 0.0401 (0.0428) / 0.3135 0.1346, 0.8938, 0.9222]\n",
      "100%|█████████████████████████| 65/65 [00:12<00:00,  5.32it/s, 0.0395 (0.0371) / 0.3145 0.1385, 0.8998, 0.9218]"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Epoch #6\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "\n",
      "100%|███████████████████████| 373/373 [01:09<00:00,  5.40it/s, 0.0393 (0.0317) / 0.3135 0.1346, 0.8957, 0.9238]\n",
      "100%|█████████████████████████| 65/65 [00:12<00:00,  5.18it/s, 0.0387 (0.0355) / 0.3145 0.1385, 0.8992, 0.9248]"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Epoch #7\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "\n",
      "100%|███████████████████████| 373/373 [01:17<00:00,  4.81it/s, 0.0381 (0.0432) / 0.3135 0.1346, 0.8982, 0.9256]\n",
      "100%|█████████████████████████| 65/65 [00:16<00:00,  3.95it/s, 0.0389 (0.0480) / 0.3145 0.1385, 0.8977, 0.9274]"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Epoch #8\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "\n",
      "100%|███████████████████████| 373/373 [01:14<00:00,  5.04it/s, 0.0375 (0.0374) / 0.3135 0.1346, 0.9000, 0.9266]\n",
      "100%|█████████████████████████| 65/65 [00:12<00:00,  5.29it/s, 0.0385 (0.0500) / 0.3145 0.1385, 0.8980, 0.9207]"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Epoch #9\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "\n",
      "100%|███████████████████████| 373/373 [01:08<00:00,  5.46it/s, 0.0367 (0.0297) / 0.3135 0.1346, 0.9017, 0.9279]\n",
      "100%|█████████████████████████| 65/65 [00:12<00:00,  5.34it/s, 0.0378 (0.0277) / 0.3145 0.1385, 0.9010, 0.9254]"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Epoch #10\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "\n",
      "100%|███████████████████████| 373/373 [01:08<00:00,  5.42it/s, 0.0361 (0.0314) / 0.3135 0.1346, 0.9034, 0.9289]\n",
      "100%|█████████████████████████| 65/65 [00:12<00:00,  5.32it/s, 0.0377 (0.0367) / 0.3145 0.1385, 0.9039, 0.9235]"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Epoch #11\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "\n",
      "100%|███████████████████████| 373/373 [01:10<00:00,  5.30it/s, 0.0357 (0.0320) / 0.3135 0.1346, 0.9040, 0.9296]\n",
      "100%|█████████████████████████| 65/65 [00:12<00:00,  5.12it/s, 0.0388 (0.0353) / 0.3145 0.1385, 0.9015, 0.9177]\n"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Epoch #12\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "100%|███████████████████████| 373/373 [01:15<00:00,  4.96it/s, 0.0355 (0.0304) / 0.3135 0.1346, 0.9048, 0.9301]\n",
      "100%|█████████████████████████| 65/65 [00:12<00:00,  5.39it/s, 0.0376 (0.0464) / 0.3145 0.1385, 0.9001, 0.9300]"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Epoch #13\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "\n",
      "100%|███████████████████████| 373/373 [01:12<00:00,  5.12it/s, 0.0347 (0.0327) / 0.3135 0.1346, 0.9067, 0.9315]\n",
      "100%|█████████████████████████| 65/65 [00:12<00:00,  5.33it/s, 0.0420 (0.0408) / 0.3145 0.1385, 0.8924, 0.9088]"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Epoch #14\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "\n",
      "100%|███████████████████████| 373/373 [01:10<00:00,  5.26it/s, 0.0342 (0.0296) / 0.3135 0.1346, 0.9077, 0.9324]\n",
      "100%|█████████████████████████| 65/65 [00:12<00:00,  5.07it/s, 0.0383 (0.0360) / 0.3145 0.1385, 0.8966, 0.9304]"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Epoch #15\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "\n",
      "100%|███████████████████████| 373/373 [01:08<00:00,  5.45it/s, 0.0341 (0.0314) / 0.3135 0.1346, 0.9078, 0.9325]\n",
      "100%|█████████████████████████| 65/65 [00:11<00:00,  5.50it/s, 0.0439 (0.0378) / 0.3145 0.1385, 0.8887, 0.9068]"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Epoch #16\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "\n",
      "100%|███████████████████████| 373/373 [01:10<00:00,  5.33it/s, 0.0337 (0.0317) / 0.3135 0.1346, 0.9091, 0.9332]\n",
      "100%|█████████████████████████| 65/65 [00:12<00:00,  5.34it/s, 0.0386 (0.0327) / 0.3145 0.1385, 0.8986, 0.9276]"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Epoch #17\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "\n",
      "100%|███████████████████████| 373/373 [01:11<00:00,  5.24it/s, 0.0333 (0.0362) / 0.3135 0.1346, 0.9096, 0.9339]\n",
      "100%|█████████████████████████| 65/65 [00:12<00:00,  5.07it/s, 0.0378 (0.0459) / 0.3145 0.1385, 0.9007, 0.9281]"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Epoch #18\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "\n",
      "100%|███████████████████████| 373/373 [01:19<00:00,  4.71it/s, 0.0330 (0.0312) / 0.3135 0.1346, 0.9106, 0.9346]\n",
      "100%|█████████████████████████| 65/65 [00:12<00:00,  5.13it/s, 0.0383 (0.0386) / 0.3145 0.1385, 0.8992, 0.9288]"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Epoch #19\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "\n",
      "100%|███████████████████████| 373/373 [01:07<00:00,  5.55it/s, 0.0322 (0.0306) / 0.3135 0.1346, 0.9127, 0.9358]\n",
      "100%|█████████████████████████| 65/65 [00:12<00:00,  5.26it/s, 0.0368 (0.0482) / 0.3145 0.1385, 0.9056, 0.9269]"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Epoch #20\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "\n",
      "100%|███████████████████████| 373/373 [01:08<00:00,  5.43it/s, 0.0321 (0.0317) / 0.3135 0.1346, 0.9130, 0.9361]\n",
      "100%|█████████████████████████| 65/65 [00:13<00:00,  4.76it/s, 0.0357 (0.0330) / 0.3145 0.1385, 0.9065, 0.9302]"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Epoch #21\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "\n",
      "100%|███████████████████████| 373/373 [01:19<00:00,  4.70it/s, 0.0321 (0.0322) / 0.3135 0.1346, 0.9127, 0.9362]\n",
      "100%|█████████████████████████| 65/65 [00:12<00:00,  5.23it/s, 0.0360 (0.0351) / 0.3145 0.1385, 0.9062, 0.9284]"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Epoch #22\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "\n",
      "100%|███████████████████████| 373/373 [01:19<00:00,  4.69it/s, 0.0317 (0.0298) / 0.3135 0.1346, 0.9141, 0.9368]\n",
      "100%|█████████████████████████| 65/65 [00:12<00:00,  5.13it/s, 0.0368 (0.0308) / 0.3145 0.1385, 0.9062, 0.9252]"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Epoch #23\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "\n",
      "100%|███████████████████████| 373/373 [01:11<00:00,  5.19it/s, 0.0313 (0.0389) / 0.3135 0.1346, 0.9148, 0.9377]\n",
      "100%|█████████████████████████| 65/65 [00:11<00:00,  5.46it/s, 0.0390 (0.0416) / 0.3145 0.1385, 0.8943, 0.9302]"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Epoch #24\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "\n",
      "100%|███████████████████████| 373/373 [01:11<00:00,  5.24it/s, 0.0308 (0.0274) / 0.3135 0.1346, 0.9164, 0.9386]\n",
      "100%|█████████████████████████| 65/65 [00:12<00:00,  5.24it/s, 0.0384 (0.0392) / 0.3145 0.1385, 0.9006, 0.9217]"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Epoch #25\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "\n",
      "100%|███████████████████████| 373/373 [01:08<00:00,  5.48it/s, 0.0303 (0.0291) / 0.3135 0.1346, 0.9173, 0.9395]\n",
      "100%|█████████████████████████| 65/65 [00:12<00:00,  5.40it/s, 0.0371 (0.0244) / 0.3145 0.1385, 0.9053, 0.9279]"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Epoch #26\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "\n",
      "100%|███████████████████████| 373/373 [01:12<00:00,  5.17it/s, 0.0301 (0.0279) / 0.3135 0.1346, 0.9181, 0.9400]\n",
      "100%|█████████████████████████| 65/65 [00:12<00:00,  5.06it/s, 0.0372 (0.0405) / 0.3145 0.1385, 0.9064, 0.9296]"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Epoch #27\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "\n",
      "100%|███████████████████████| 373/373 [01:12<00:00,  5.13it/s, 0.0296 (0.0370) / 0.3135 0.1346, 0.9190, 0.9411]\n",
      "100%|█████████████████████████| 65/65 [00:12<00:00,  5.39it/s, 0.0370 (0.0295) / 0.3145 0.1385, 0.9027, 0.9306]"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Epoch #28\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "\n",
      "100%|███████████████████████| 373/373 [01:12<00:00,  5.15it/s, 0.0296 (0.0326) / 0.3135 0.1346, 0.9188, 0.9410]\n",
      "100%|█████████████████████████| 65/65 [00:12<00:00,  5.20it/s, 0.0370 (0.0418) / 0.3145 0.1385, 0.9049, 0.9296]"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Epoch #29\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "\n",
      "100%|███████████████████████| 373/373 [01:11<00:00,  5.22it/s, 0.0293 (0.0269) / 0.3135 0.1346, 0.9201, 0.9416]\n",
      "100%|█████████████████████████| 65/65 [00:12<00:00,  5.32it/s, 0.0380 (0.0339) / 0.3145 0.1385, 0.9047, 0.9258]"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Epoch #30\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "\n",
      "100%|███████████████████████| 373/373 [01:16<00:00,  4.87it/s, 0.0288 (0.0266) / 0.3135 0.1346, 0.9209, 0.9425]\n",
      "100%|█████████████████████████| 65/65 [00:12<00:00,  5.15it/s, 0.0370 (0.0450) / 0.3145 0.1385, 0.9063, 0.9294]"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Epoch #31\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "\n",
      "100%|███████████████████████| 373/373 [01:14<00:00,  5.01it/s, 0.0285 (0.0305) / 0.3135 0.1346, 0.9217, 0.9431]\n",
      "100%|█████████████████████████| 65/65 [00:12<00:00,  5.26it/s, 0.0388 (0.0297) / 0.3145 0.1385, 0.9007, 0.9290]"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Epoch #32\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "\n",
      "100%|███████████████████████| 373/373 [01:18<00:00,  4.74it/s, 0.0288 (0.0304) / 0.3135 0.1346, 0.9209, 0.9426]\n",
      "100%|█████████████████████████| 65/65 [00:12<00:00,  5.16it/s, 0.0394 (0.0367) / 0.3145 0.1385, 0.9036, 0.9246]"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Epoch #33\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "\n",
      "100%|███████████████████████| 373/373 [01:10<00:00,  5.29it/s, 0.0281 (0.0385) / 0.3135 0.1346, 0.9228, 0.9442]\n",
      "100%|█████████████████████████| 65/65 [00:12<00:00,  5.05it/s, 0.0380 (0.0317) / 0.3145 0.1385, 0.9059, 0.9284]"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Epoch #34\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "\n",
      "100%|███████████████████████| 373/373 [01:11<00:00,  5.19it/s, 0.0276 (0.0316) / 0.3135 0.1346, 0.9243, 0.9451]\n",
      "100%|█████████████████████████| 65/65 [00:12<00:00,  5.38it/s, 0.0368 (0.0301) / 0.3145 0.1385, 0.9059, 0.9304]"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Epoch #35\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "\n",
      "100%|███████████████████████| 373/373 [01:08<00:00,  5.44it/s, 0.0272 (0.0264) / 0.3135 0.1346, 0.9252, 0.9460]\n",
      "100%|█████████████████████████| 65/65 [00:12<00:00,  5.18it/s, 0.0369 (0.0309) / 0.3145 0.1385, 0.9066, 0.9299]"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Epoch #36\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "\n",
      "100%|███████████████████████| 373/373 [01:14<00:00,  5.00it/s, 0.0271 (0.0276) / 0.3135 0.1346, 0.9253, 0.9463]\n",
      "100%|█████████████████████████| 65/65 [00:12<00:00,  5.21it/s, 0.0382 (0.0413) / 0.3145 0.1385, 0.9032, 0.9298]"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Epoch #37\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "\n",
      "100%|███████████████████████| 373/373 [01:09<00:00,  5.37it/s, 0.0266 (0.0382) / 0.3135 0.1346, 0.9262, 0.9472]\n",
      "100%|█████████████████████████| 65/65 [00:12<00:00,  5.34it/s, 0.0403 (0.0520) / 0.3145 0.1385, 0.9013, 0.9273]"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Epoch #38\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "\n",
      "100%|███████████████████████| 373/373 [01:09<00:00,  5.33it/s, 0.0265 (0.0261) / 0.3135 0.1346, 0.9268, 0.9474]\n",
      "100%|█████████████████████████| 65/65 [00:12<00:00,  5.07it/s, 0.0394 (0.0310) / 0.3145 0.1385, 0.9032, 0.9284]"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Epoch #39\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "\n",
      "100%|███████████████████████| 373/373 [01:10<00:00,  5.30it/s, 0.0259 (0.0270) / 0.3135 0.1346, 0.9283, 0.9486]\n",
      "100%|█████████████████████████| 65/65 [00:12<00:00,  5.31it/s, 0.0391 (0.0380) / 0.3145 0.1385, 0.9030, 0.9294]"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Epoch #40\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "\n",
      "100%|███████████████████████| 373/373 [01:15<00:00,  4.91it/s, 0.0259 (0.0280) / 0.3135 0.1346, 0.9284, 0.9485]\n",
      "100%|█████████████████████████| 65/65 [00:12<00:00,  5.29it/s, 0.0400 (0.0606) / 0.3145 0.1385, 0.9045, 0.9280]"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Epoch #41\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "\n",
      "100%|███████████████████████| 373/373 [01:13<00:00,  5.06it/s, 0.0256 (0.0277) / 0.3135 0.1346, 0.9293, 0.9493]\n",
      "100%|█████████████████████████| 65/65 [00:13<00:00,  5.00it/s, 0.0400 (0.0373) / 0.3145 0.1385, 0.9041, 0.9256]"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Epoch #42\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "\n",
      "100%|███████████████████████| 373/373 [01:13<00:00,  5.10it/s, 0.0253 (0.0224) / 0.3135 0.1346, 0.9301, 0.9499]\n",
      "100%|█████████████████████████| 65/65 [00:12<00:00,  5.09it/s, 0.0424 (0.0563) / 0.3145 0.1385, 0.9009, 0.9199]"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Epoch #43\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "\n",
      "100%|███████████████████████| 373/373 [01:25<00:00,  4.34it/s, 0.0247 (0.0256) / 0.3135 0.1346, 0.9314, 0.9512]\n",
      "100%|█████████████████████████| 65/65 [00:12<00:00,  5.14it/s, 0.0402 (0.0491) / 0.3145 0.1385, 0.9035, 0.9290]"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Epoch #45\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "\n",
      "100%|███████████████████████| 373/373 [01:50<00:00,  3.39it/s, 0.0246 (0.0219) / 0.3135 0.1346, 0.9318, 0.9513]\n",
      "100%|█████████████████████████| 65/65 [00:12<00:00,  5.19it/s, 0.0450 (0.0333) / 0.3145 0.1385, 0.8929, 0.9260]"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Epoch #46\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "\n",
      "100%|███████████████████████| 373/373 [01:21<00:00,  4.56it/s, 0.0240 (0.0244) / 0.3135 0.1346, 0.9334, 0.9526]\n",
      "100%|█████████████████████████| 65/65 [00:12<00:00,  5.13it/s, 0.0412 (0.0442) / 0.3145 0.1385, 0.9049, 0.9262]"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Epoch #47\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "\n",
      "100%|███████████████████████| 373/373 [01:15<00:00,  4.94it/s, 0.0237 (0.0331) / 0.3135 0.1346, 0.9340, 0.9532]\n",
      "100%|█████████████████████████| 65/65 [00:13<00:00,  4.97it/s, 0.0418 (0.0266) / 0.3145 0.1385, 0.9040, 0.9291]\n"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Epoch #48\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      " 20%|████▉                   | 76/373 [00:14<00:54,  5.41it/s, 0.0244 (0.0247) / 0.3118 0.1359, 0.9317, 0.9512]IOPub message rate exceeded.\n",
      "The notebook server will temporarily stop sending output\n",
      "to the client in order to avoid crashing it.\n",
      "To change this limit, set the config variable\n",
      "`--NotebookApp.iopub_msg_rate_limit`.\n",
      "\n",
      "Current values:\n",
      "NotebookApp.iopub_msg_rate_limit=1000.0 (msgs/sec)\n",
      "NotebookApp.rate_limit_window=3.0 (secs)\n",
      "\n"
     ]
    }
   ],
   "source": [
    "batch_size = 20\n",
    "num_workers = 4\n",
    "epoch_resume = 0\n",
    "num_epochs=50\n",
    "with open(os.path.join(output, \"log.csv\"), \"a\") as f:\n",
    "\n",
    "    bestLoss = float(\"inf\")\n",
    "    for epoch in range(epoch_resume, num_epochs):\n",
    "        print(\"Epoch #{}\".format(epoch), flush=True)\n",
    "        for phase in ['train', 'val']:\n",
    "            start_time = time.time()\n",
    "            for i in range(torch.cuda.device_count()):\n",
    "                torch.cuda.reset_peak_memory_stats(i)\n",
    "\n",
    "            ds = dataset[phase]\n",
    "            dataloader = torch.utils.data.DataLoader(\n",
    "                ds, batch_size=batch_size, num_workers=num_workers, shuffle=True, pin_memory=(device.type == \"cuda\"), drop_last=(phase == \"train\"))\n",
    "\n",
    "            loss, large_inter, large_union, small_inter, small_union = run_epoch(model, dataloader, phase == \"train\", optim, device)\n",
    "            overall_dice = 2 * (large_inter.sum() + small_inter.sum()) / (large_union.sum() + large_inter.sum() + small_union.sum() + small_inter.sum())\n",
    "            large_dice = 2 * large_inter.sum() / (large_union.sum() + large_inter.sum())\n",
    "            small_dice = 2 * small_inter.sum() / (small_union.sum() + small_inter.sum())\n",
    "            f.write(\"{},{},{},{},{},{},{},{},{},{},{}\\n\".format(epoch,\n",
    "                                                                phase,\n",
    "                                                                loss,\n",
    "                                                                overall_dice,\n",
    "                                                                large_dice,\n",
    "                                                                small_dice,\n",
    "                                                                time.time() - start_time,\n",
    "                                                                large_inter.size,\n",
    "                                                                sum(torch.cuda.max_memory_allocated() for i in range(torch.cuda.device_count())),\n",
    "                                                                sum(torch.cuda.max_memory_reserved() for i in range(torch.cuda.device_count())),\n",
    "                                                                batch_size))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 51,
   "id": "c631deb1",
   "metadata": {},
   "outputs": [],
   "source": [
    "ds_train = dataset['train']"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 59,
   "id": "e30ebfbd",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "(3, 112, 112) (112, 112)\n"
     ]
    }
   ],
   "source": [
    "for x, y in ds_train:\n",
    "    print(y[0].shape,y[2].shape)\n",
    "    break"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 60,
   "id": "1a596af0",
   "metadata": {},
   "outputs": [],
   "source": [
    "import cv2"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 73,
   "id": "53ae9dba",
   "metadata": {},
   "outputs": [],
   "source": [
    "import matplotlib.pyplot as plt\n",
    "r = cv2.addWeighted(np.transpose(y[0],(1,2,0))[:,:,0], 0.7,cv2.cvtColor(y[2], cv2.COLOR_GRAY2BGR)[:,:,0], 0.3, 0)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 76,
   "id": "3c680cab",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "<matplotlib.image.AxesImage at 0x7ff7179c0d90>"
      ]
     },
     "execution_count": 76,
     "metadata": {},
     "output_type": "execute_result"
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 640x480 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "plt.imshow(cv2.cvtColor(y[2], cv2.COLOR_GRAY2BGR))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 68,
   "id": "9b5dd8fe",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "(3, 112, 112)"
      ]
     },
     "execution_count": 68,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "np.transpose(cv2.cvtColor(y[2], cv2.COLOR_GRAY2BGR),(2,0,1)).shape"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 63,
   "id": "d25ca671",
   "metadata": {},
   "outputs": [
    {
     "ename": "error",
     "evalue": "OpenCV(4.8.0) /io/opencv/modules/imgproc/src/color.simd_helpers.hpp:92: error: (-2:Unspecified error) in function 'cv::impl::{anonymous}::CvtHelper<VScn, VDcn, VDepth, sizePolicy>::CvtHelper(cv::InputArray, cv::OutputArray, int) [with VScn = cv::impl::{anonymous}::Set<3, 4>; VDcn = cv::impl::{anonymous}::Set<1>; VDepth = cv::impl::{anonymous}::Set<0, 2, 5>; cv::impl::{anonymous}::SizePolicy sizePolicy = cv::impl::<unnamed>::NONE; cv::InputArray = const cv::_InputArray&; cv::OutputArray = const cv::_OutputArray&]'\n> Invalid number of channels in input image:\n>     'VScn::contains(scn)'\n> where\n>     'scn' is 112\n",
     "output_type": "error",
     "traceback": [
      "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m",
      "\u001b[0;31merror\u001b[0m                                     Traceback (most recent call last)",
      "Cell \u001b[0;32mIn[63], line 1\u001b[0m\n\u001b[0;32m----> 1\u001b[0m frame \u001b[38;5;241m=\u001b[39m \u001b[43mcv2\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mcvtColor\u001b[49m\u001b[43m(\u001b[49m\u001b[43my\u001b[49m\u001b[43m[\u001b[49m\u001b[38;5;241;43m0\u001b[39;49m\u001b[43m]\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mcv2\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mCOLOR_BGR2GRAY\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m      2\u001b[0m frame\u001b[38;5;241m.\u001b[39mshape\n",
      "\u001b[0;31merror\u001b[0m: OpenCV(4.8.0) /io/opencv/modules/imgproc/src/color.simd_helpers.hpp:92: error: (-2:Unspecified error) in function 'cv::impl::{anonymous}::CvtHelper<VScn, VDcn, VDepth, sizePolicy>::CvtHelper(cv::InputArray, cv::OutputArray, int) [with VScn = cv::impl::{anonymous}::Set<3, 4>; VDcn = cv::impl::{anonymous}::Set<1>; VDepth = cv::impl::{anonymous}::Set<0, 2, 5>; cv::impl::{anonymous}::SizePolicy sizePolicy = cv::impl::<unnamed>::NONE; cv::InputArray = const cv::_InputArray&; cv::OutputArray = const cv::_OutputArray&]'\n> Invalid number of channels in input image:\n>     'VScn::contains(scn)'\n> where\n>     'scn' is 112\n"
     ]
    }
   ],
   "source": [
    "frame = cv2.cvtColor(y[0], cv2.COLOR_BGR2GRAY)\n",
    "frame.shape"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "4de4b106",
   "metadata": {},
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3 (ipykernel)",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.10.14"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 5
}
